From ceee8d96630df971daaeab9477ffdf84798753a1 Mon Sep 17 00:00:00 2001 From: Kevin Feiler Date: Thu, 16 Oct 2025 01:15:48 +0200 Subject: [PATCH] Update high --- .DS_Store | Bin 0 -> 6148 bytes CHANGELOG.md | 62 + INFO.txt | 150 + INSTALLATION.md | 184 + README.md | 66 +- SUMMARY.md | 176 + TeaSpeak/.DS_Store | Bin 0 -> 8196 bytes TeaSpeak/addons/.DS_Store | Bin 0 -> 6148 bytes TeaSpeak/addons/teamspeak/css/style.css | 51 + TeaSpeak/addons/teamspeak/js/script.js | 42 + TeaSpeak/addons/teamspeak/lang/danish.php | 110 + TeaSpeak/addons/teamspeak/lang/english.php | 109 + TeaSpeak/addons/teamspeak/lang/german.php | 109 + .../addons/teamspeak/lang/portuguese-br.php | 110 + TeaSpeak/addons/teamspeak/lang/portuguese.php | 110 + TeaSpeak/addons/teamspeak/lang/spanish.php | 110 + TeaSpeak/addons/teamspeak/lib/functions.php | 50 + TeaSpeak/addons/teamspeak/teamspeak.php | 701 +++ TeaSpeak/servers/.DS_Store | Bin 0 -> 6148 bytes TeaSpeak/servers/teamspeak/hooks.php | 38 + TeaSpeak/servers/teamspeak/lang.json | 1042 ++++ TeaSpeak/servers/teamspeak/lib/Requests.php | 980 ++++ .../servers/teamspeak/lib/Requests/Auth.php | 33 + .../teamspeak/lib/Requests/Auth/Basic.php | 88 + .../servers/teamspeak/lib/Requests/Cookie.php | 500 ++ .../teamspeak/lib/Requests/Cookie/Jar.php | 175 + .../teamspeak/lib/Requests/Exception.php | 62 + .../teamspeak/lib/Requests/Exception/HTTP.php | 71 + .../lib/Requests/Exception/HTTP/304.php | 27 + .../lib/Requests/Exception/HTTP/305.php | 27 + .../lib/Requests/Exception/HTTP/306.php | 27 + .../lib/Requests/Exception/HTTP/400.php | 27 + .../lib/Requests/Exception/HTTP/401.php | 27 + .../lib/Requests/Exception/HTTP/402.php | 27 + .../lib/Requests/Exception/HTTP/403.php | 27 + .../lib/Requests/Exception/HTTP/404.php | 27 + .../lib/Requests/Exception/HTTP/405.php | 27 + .../lib/Requests/Exception/HTTP/406.php | 27 + .../lib/Requests/Exception/HTTP/407.php | 27 + .../lib/Requests/Exception/HTTP/408.php | 27 + .../lib/Requests/Exception/HTTP/409.php | 27 + .../lib/Requests/Exception/HTTP/410.php | 27 + .../lib/Requests/Exception/HTTP/411.php | 27 + .../lib/Requests/Exception/HTTP/412.php | 27 + .../lib/Requests/Exception/HTTP/413.php | 27 + .../lib/Requests/Exception/HTTP/414.php | 27 + .../lib/Requests/Exception/HTTP/415.php | 27 + .../lib/Requests/Exception/HTTP/416.php | 27 + .../lib/Requests/Exception/HTTP/417.php | 27 + .../lib/Requests/Exception/HTTP/418.php | 29 + .../lib/Requests/Exception/HTTP/428.php | 29 + .../lib/Requests/Exception/HTTP/429.php | 29 + .../lib/Requests/Exception/HTTP/431.php | 29 + .../lib/Requests/Exception/HTTP/500.php | 27 + .../lib/Requests/Exception/HTTP/501.php | 27 + .../lib/Requests/Exception/HTTP/502.php | 27 + .../lib/Requests/Exception/HTTP/503.php | 27 + .../lib/Requests/Exception/HTTP/504.php | 27 + .../lib/Requests/Exception/HTTP/505.php | 27 + .../lib/Requests/Exception/HTTP/511.php | 29 + .../lib/Requests/Exception/HTTP/Unknown.php | 44 + .../lib/Requests/Exception/Transport.php | 5 + .../lib/Requests/Exception/Transport/cURL.php | 56 + .../servers/teamspeak/lib/Requests/Hooker.php | 33 + .../servers/teamspeak/lib/Requests/Hooks.php | 68 + .../teamspeak/lib/Requests/IDNAEncoder.php | 388 ++ .../servers/teamspeak/lib/Requests/IPv6.php | 190 + .../servers/teamspeak/lib/Requests/IRI.php | 1084 ++++ .../servers/teamspeak/lib/Requests/Proxy.php | 35 + .../teamspeak/lib/Requests/Proxy/HTTP.php | 151 + .../teamspeak/lib/Requests/Response.php | 121 + .../lib/Requests/Response/Headers.php | 98 + .../servers/teamspeak/lib/Requests/SSL.php | 152 + .../teamspeak/lib/Requests/Session.php | 266 + .../teamspeak/lib/Requests/Transport.php | 41 + .../teamspeak/lib/Requests/Transport/cURL.php | 542 ++ .../lib/Requests/Transport/cacert.pem | 3554 ++++++++++++ .../lib/Requests/Transport/fsockopen.php | 444 ++ .../Utility/CaseInsensitiveDictionary.php | 103 + .../lib/Requests/Utility/FilteredIterator.php | 45 + TeaSpeak/servers/teamspeak/lib/TSDNS.php | 41 + TeaSpeak/servers/teamspeak/lib/TeamSpeak.php | 4752 +++++++++++++++++ TeaSpeak/servers/teamspeak/teamspeak.php | 1176 ++++ .../teamspeak/teamspeak_additional.php | 555 ++ .../servers/teamspeak/templates/backups.tpl | 56 + TeaSpeak/servers/teamspeak/templates/bans.tpl | 92 + .../servers/teamspeak/templates/error.tpl | 4 + .../servers/teamspeak/templates/overview.tpl | 277 + .../teamspeak/templates/overview_modern.tpl | 351 ++ .../servers/teamspeak/templates/settings.tpl | 43 + .../servers/teamspeak/templates/tokens.tpl | 80 + .../servers/teamspeak/templates/tsdns.tpl | 44 + 92 files changed, 20860 insertions(+), 34 deletions(-) create mode 100644 .DS_Store create mode 100644 CHANGELOG.md create mode 100644 INFO.txt create mode 100644 INSTALLATION.md create mode 100644 SUMMARY.md create mode 100644 TeaSpeak/.DS_Store create mode 100644 TeaSpeak/addons/.DS_Store create mode 100644 TeaSpeak/addons/teamspeak/css/style.css create mode 100644 TeaSpeak/addons/teamspeak/js/script.js create mode 100644 TeaSpeak/addons/teamspeak/lang/danish.php create mode 100644 TeaSpeak/addons/teamspeak/lang/english.php create mode 100644 TeaSpeak/addons/teamspeak/lang/german.php create mode 100644 TeaSpeak/addons/teamspeak/lang/portuguese-br.php create mode 100644 TeaSpeak/addons/teamspeak/lang/portuguese.php create mode 100644 TeaSpeak/addons/teamspeak/lang/spanish.php create mode 100644 TeaSpeak/addons/teamspeak/lib/functions.php create mode 100644 TeaSpeak/addons/teamspeak/teamspeak.php create mode 100644 TeaSpeak/servers/.DS_Store create mode 100644 TeaSpeak/servers/teamspeak/hooks.php create mode 100644 TeaSpeak/servers/teamspeak/lang.json create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Auth.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Auth/Basic.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Cookie.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Cookie/Jar.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/304.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/305.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/306.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/400.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/401.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/402.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/403.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/404.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/405.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/406.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/407.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/408.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/409.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/410.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/411.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/412.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/413.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/414.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/415.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/416.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/417.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/418.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/428.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/429.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/431.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/500.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/501.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/502.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/503.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/504.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/505.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/511.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/Unknown.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/Transport.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Exception/Transport/cURL.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Hooker.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Hooks.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/IDNAEncoder.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/IPv6.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/IRI.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Proxy.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Proxy/HTTP.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Response.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Response/Headers.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/SSL.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Session.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Transport.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Transport/cURL.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Transport/cacert.pem create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Transport/fsockopen.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Utility/CaseInsensitiveDictionary.php create mode 100644 TeaSpeak/servers/teamspeak/lib/Requests/Utility/FilteredIterator.php create mode 100644 TeaSpeak/servers/teamspeak/lib/TSDNS.php create mode 100644 TeaSpeak/servers/teamspeak/lib/TeamSpeak.php create mode 100644 TeaSpeak/servers/teamspeak/teamspeak.php create mode 100644 TeaSpeak/servers/teamspeak/teamspeak_additional.php create mode 100644 TeaSpeak/servers/teamspeak/templates/backups.tpl create mode 100644 TeaSpeak/servers/teamspeak/templates/bans.tpl create mode 100644 TeaSpeak/servers/teamspeak/templates/error.tpl create mode 100644 TeaSpeak/servers/teamspeak/templates/overview.tpl create mode 100644 TeaSpeak/servers/teamspeak/templates/overview_modern.tpl create mode 100644 TeaSpeak/servers/teamspeak/templates/settings.tpl create mode 100644 TeaSpeak/servers/teamspeak/templates/tokens.tpl create mode 100644 TeaSpeak/servers/teamspeak/templates/tsdns.tpl diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e001f64c29942bacc17d16762f132e2d1cd3b736 GIT binary patch literal 6148 zcmeHKPfrs;6n_I%wji=VtB5h#*oy`di~o|w7;3?2V+@26ECSZub|{-JGtKUn3WTI* zJ^2Aly!s7Hym<8D)tk|8pjS`&=FbMOc=2Ei*_XWey_xsk?7rV*XLbO96k4?@022TV zRDp?pY>p7&7uqE~dL)5JEVNxleVO3aD2A*)a#@YH3%tc@fy^x_hmkar6?1HN_v+2;q&1bx z?M+&{xv6WD){R_tZ!c-2GgodcR2tqUsFJcGYF| za!8+rC3lBb%#q(h7ijIt{?Ouf6Jt{Q19G~1KBY{~H@ChX(6D^KUapu!LDlD;H_rn% zbU9mI4Uq3*NH>dYo#PX?kn6doa0N@$4-mU@%FDLz+pJCt+iRZfP;ZVEco_1{vRma$ zz4?%w7Q6F46;o!WzbiH~`3I44Nf{<&lz}9tB1u^$aQj?Oq2VhNFI|a*&r_Q)dW4!VqZ}Gs3ief zU5mX{@|nk39eq(=lyFQ@muU?lMJ3Q?(uDwW`dtj1+Jj$68)*Vs|0(t+s92hmR^`i4SOIuJ{S1Ia6l z+n9lvfx`^+s;(){|GR&_{~u0@docqs1ILO1l9(;c7O*6JwssXK&RPrgDXI_=*HI`_ lu+hh{G{jLnhAIVpmM{?W8aoPc1SS3vkTk?i%)mco;1{@>*{}cr literal 0 HcmV?d00001 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..118fc03 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,62 @@ +# Changelog + +All notable changes to the TeaSpeak WHMCS Module will be documented in this file. + +## [3.0.0] - 2024 - Updated Edition + +**Updated by:** Kevin Feiler / AVVGO + +### Added +- PHP 8.x compatibility (8.0, 8.1, 8.2, 8.3) +- WHMCS API 1.2 support +- Strict type declarations (`declare(strict_types=1)`) +- Type hints for all function parameters and return types +- Modern array syntax (`[]` instead of `array()`) +- Bootstrap 5 template option (`overview_modern.tpl`) +- Font Awesome 6 icon support +- Comprehensive code documentation +- Author credits and version information in file headers + +### Changed +- Updated to modern PHP syntax throughout +- Improved error handling and messages +- Better input validation +- Enhanced security practices +- Optimized database queries +- Removed hardcoded URLs +- Improved code structure and readability +- Updated README with detailed installation and upgrade instructions + +### Improved +- Mobile responsiveness in templates +- User experience with better UI design +- Code maintainability +- Performance optimizations +- Error logging and debugging capabilities + +### Fixed +- Various bugs and edge cases +- Deprecated PHP syntax +- Security vulnerabilities +- Code consistency issues + +--- + +## [2.1.4] - Previous Version + +**Original Author:** planetteaspeak.de + +### Features +- TeamSpeak server provisioning +- Client area management +- Token/Privileges management +- Ban management +- Backup functionality +- TSDNS integration +- Bootstrap 3 design +- PHP 7.x compatibility +- WHMCS API 1.1 + +--- + +**Note:** This changelog covers the major update from version 2.1.4 to 3.0.0. The update focuses on modernization, compatibility, and code quality improvements while maintaining backward compatibility with existing installations. \ No newline at end of file diff --git a/INFO.txt b/INFO.txt new file mode 100644 index 0000000..d1aeb8f --- /dev/null +++ b/INFO.txt @@ -0,0 +1,150 @@ +╔═══════════════════════════════════════════════════════════════╗ +║ ║ +║ TeaSpeak WHMCS Provisioning Module v3.0.0 ║ +║ Updated Edition 2024 ║ +║ ║ +╚═══════════════════════════════════════════════════════════════╝ + +📦 WAS WURDE GEMACHT? +════════════════════════════════════════════════════════════════ + +✅ PHP 8.x Kompatibilität + - Strict Types + - Type Hints + - Moderne Array-Syntax + - Verbesserte Fehlerbehandlung + +✅ WHMCS API 1.2 + - Aktualisiert auf die neueste API-Version + +✅ Design Verbesserungen + - Bootstrap 5 Template (optional) + - Font Awesome 6 Icons + - Besseres Mobile Design + - Verbesserte Benutzerfreundlichkeit + +✅ Code Verbesserungen + - Bessere Dokumentation + - Entfernte Hardcoded URLs + - Sicherheitsverbesserungen + - Code-Cleanup und Optimierung + + +📂 DATEIEN +════════════════════════════════════════════════════════════════ + +Hauptmodul: + TeaSpeak/servers/teamspeak/teamspeak.php (modernisiert) + TeaSpeak/servers/teamspeak/teamspeak_additional.php (neu) + +Templates: + TeaSpeak/servers/teamspeak/templates/overview.tpl (original) + TeaSpeak/servers/teamspeak/templates/overview_modern.tpl (neu) + +Dokumentation: + README.md (vollständige Dokumentation) + CHANGELOG.md (Änderungsprotokoll) + INSTALLATION.md (Installationsanleitung) + INFO.txt (diese Datei) + + +🚀 INSTALLATION +════════════════════════════════════════════════════════════════ + +1. Upload der Dateien: + - TeaSpeak/servers/teamspeak/ → modules/servers/teamspeak/ + - TeaSpeak/addons/teamspeak/ → modules/addons/teamspeak/ + +2. Addon aktivieren: + WHMCS Admin → Setup → Addon Modules + +3. Server hinzufügen: + WHMCS Admin → Setup → Servers + +4. Produkt erstellen mit Custom Fields: + - Token (Text Box) + - Port (Text Box) + - Subdomain (Text Box, optional) + +5. Configurable Options hinzufügen: + - Slots (Quantity) + - MBots (Quantity) + + +📝 WICHTIGE HINWEISE +════════════════════════════════════════════════════════════════ + +⚠️ Die Datenbankstruktur ist kompatibel mit der alten Version +⚠️ Backup vor dem Update empfohlen +⚠️ Custom Field Namen sind case-sensitive (Token, Port, Subdomain) +⚠️ Configurable Option Namen sind case-sensitive (Slots, MBots) + + +🎨 NEUES DESIGN AKTIVIEREN (optional) +════════════════════════════════════════════════════════════════ + +In teamspeak.php, Funktion teamspeak_ClientArea(): + +Ändere: + 'tabOverviewReplacementTemplate' => 'templates/overview.tpl', + +Nach: + 'tabOverviewReplacementTemplate' => 'templates/overview_modern.tpl', + + +🔄 UPGRADE VON ALTER VERSION +════════════════════════════════════════════════════════════════ + +1. Backup erstellen: + - Dateien: modules/servers/teamspeak/ + - Dateien: modules/addons/teamspeak/ + - Datenbank: mysqldump + +2. Neue Dateien hochladen und überschreiben + +3. Cache leeren: + WHMCS Admin → Utilities → System → Clear Cache + +4. Testen: + - Bestehende Services prüfen + - Neuen Test-Service erstellen + + +✨ FEATURES +════════════════════════════════════════════════════════════════ + +✓ Server erstellen/löschen +✓ Server suspendieren/reaktivieren +✓ Server starten/stoppen +✓ Server neuinstallieren +✓ Berechtigungen zurücksetzen +✓ Einstellungen verwalten +✓ Token/Privilegien verwalten +✓ Bans verwalten +✓ Backups erstellen/wiederherstellen +✓ TSDNS Integration + + +📧 SUPPORT & CREDITS +════════════════════════════════════════════════════════════════ + +Original Modul: planetteaspeak.de +Update & Design: Kevin Feiler / AVVGO (2024) +Version: 3.0.0 +TeaSpeak: https://teaspeak.de + + +📖 WEITERE INFOS +════════════════════════════════════════════════════════════════ + +Siehe README.md für die vollständige Dokumentation mit: +- Detaillierte Installationsanleitung +- Konfigurationsoptionen +- Troubleshooting +- Sicherheitshinweise +- FAQ + + +════════════════════════════════════════════════════════════════ + Viel Erfolg mit dem aktualisierten TeaSpeak WHMCS Modul! +════════════════════════════════════════════════════════════════ diff --git a/INSTALLATION.md b/INSTALLATION.md new file mode 100644 index 0000000..33ceff8 --- /dev/null +++ b/INSTALLATION.md @@ -0,0 +1,184 @@ +# TeaSpeak WHMCS Module - Quick Installation Guide + +## 📋 Requirements + +- **WHMCS**: 8.0 or higher +- **PHP**: 8.0 or higher +- **MySQL/MariaDB**: 5.7+ / 10.2+ +- **PHP Extensions**: curl, json, pdo_mysql, mbstring + +## 🚀 Quick Installation + +### Step 1: Upload Files + +Upload the module files to your WHMCS installation: + +```bash +/path/to/whmcs/modules/servers/teamspeak/ +/path/to/whmcs/modules/addons/teamspeak/ +``` + +### Step 2: Activate Addon Module + +1. Login to WHMCS Admin Area +2. Navigate to: **Setup > Addon Modules** +3. Find "TeaSpeak Provisioning" +4. Click **Activate** +5. Configure module settings: + - License Key + - Server Name + - Port Range (Min/Max) + - TSDNS Settings (if applicable) + - Branding options + +### Step 3: Add Server + +1. Go to: **Setup > Products/Services > Servers** +2. Click **Add New Server** +3. Fill in details: + - Name: Your server name + - Hostname/IP: Your TeamSpeak server IP + - Type: Select **TeaSpeak Provisioning Server** + - ServerQuery Port: 10101 (default) + - Username: ServerQuery username + - Password: ServerQuery password +4. Click **Test Connection** to verify +5. Save + +### Step 4: Create Product + +1. Go to: **Setup > Products/Services > Products/Services** +2. Create a new product or edit existing +3. Module Settings: + - Module: **TeaSpeak Provisioning Server** + - Select your server from dropdown + +### Step 5: Add Custom Fields + +Add these custom fields to your product: + +**Required:** + +1. **Token** + - Field Name: `Token` + - Field Type: Text Box + - Description: Admin Token + - Show on Order Form: No + +2. **Port** + - Field Name: `Port` + - Field Type: Text Box + - Description: Server Port + - Show on Order Form: No + +3. **Subdomain** (only if using TSDNS) + - Field Name: `Subdomain` + - Field Type: Text Box + - Description: TSDNS Subdomain + - Show on Order Form: Yes + - Required: Yes + +### Step 6: Add Configurable Options + +Create a configurable options group with: + +1. **Slots** + - Option Name: `Slots` + - Option Type: Quantity + - Description: Number of voice slots + +2. **MBots** + - Option Name: `MBots` + - Option Type: Quantity + - Description: Music bot limit + +### Step 7: Test + +1. Create a test order +2. Check if server is provisioned correctly +3. Test all functions in client area: + - Start/Stop + - Reinstall + - Settings + - Backups + - Tokens + - Bans + +## 🎨 Enable Modern Design (Optional) + +To use the Bootstrap 5 template: + +1. Open `modules/servers/teamspeak/teamspeak.php` +2. Find the `teamspeak_ClientArea` function +3. Change template file: + ```php + // From: + 'tabOverviewReplacementTemplate' => 'templates/overview.tpl', + + // To: + 'tabOverviewReplacementTemplate' => 'templates/overview_modern.tpl', + ``` + +## 🔄 Upgrading from Old Version + +1. **Backup everything:** + ```bash + cp -r modules/servers/teamspeak /backup/ + cp -r modules/addons/teamspeak /backup/ + mysqldump -u username -p database_name > backup.sql + ``` + +2. **Replace files:** + - Upload new module files + - Overwrite existing files + +3. **Clear cache:** + - WHMCS Admin > Utilities > System > Clear Cache + +4. **Test:** + - Test existing services + - Create new test service + - Verify all functions work + +## ⚠️ Important Notes + +- Custom field names are **case-sensitive** (`Token`, `Port`, `Subdomain`) +- Configurable option names are **case-sensitive** (`Slots`, `MBots`) +- Make sure ServerQuery port (10101) is accessible +- TSDNS is optional - only configure if needed +- Database structure is compatible with old version + +## 🆘 Troubleshooting + +### "Port does not exist in custom fields" +- Check custom field "Port" exists +- Field name must be exactly: `Port` +- Assigned to correct product + +### "Slots parameter not found" +- Check configurable option "Slots" exists +- Option name must be exactly: `Slots` + +### "Could not connect to TeamSpeak server" +- Verify IP address and port +- Check firewall rules +- Verify ServerQuery credentials +- Test connection from WHMCS server: + ```bash + telnet YOUR_IP 10101 + ``` + +### TSDNS not working +- Enable TSDNS in addon module settings +- Verify TSDNS API URL and key +- Check custom field "Subdomain" exists + +## 📚 More Information + +See `README.md` for detailed documentation. + +--- + +**Version**: 3.0.0 +**Updated by**: Kevin Feiler / AVVGO +**Original**: planetteaspeak.de \ No newline at end of file diff --git a/README.md b/README.md index 7231a08..b8796a4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# TeaSpeak WHMCS Provisioning Module - Modernized Edition +# TeaSpeak WHMCS Provisioning Module - Updated Edition [![PHP Version](https://img.shields.io/badge/PHP-8.0%2B-blue.svg)](https://www.php.net/) [![WHMCS Version](https://img.shields.io/badge/WHMCS-8.0%2B-green.svg)](https://www.whmcs.com/) @@ -6,31 +6,29 @@ ## 🚀 What's New in This Version -This is a **fully modernized** version of the TeaSpeak WHMCS module with the following improvements: +This is an **updated and redesigned** version of the TeaSpeak WHMCS module with the following improvements: -### ✨ Major Updates +### ✨ Updates & Improvements -- **PHP 8.x Compatible** - Full support for PHP 8.0, 8.1, 8.2, and 8.3 -- **WHMCS API 1.2** - Updated to the latest WHMCS module API -- **Modern PHP Features**: - - Strict types (`declare(strict_types=1)`) - - Type hints for all parameters and return types - - Modern array syntax (`[]` instead of `array()`) - - Arrow functions and null coalescing operators +- **PHP 8.x Compatible** - Updated for PHP 8.0+ +- **WHMCS API 1.2** - Updated to current WHMCS module API +- **Modern PHP Syntax**: + - Strict types + - Type hints for parameters and return types + - Modern array syntax - Improved error handling -- **Bootstrap 5 Design** - Beautiful, responsive UI - - Modern card-based layout +- **Design Updates** - Refreshed UI + - Bootstrap 5 template option - Font Awesome 6 icons - Improved mobile responsiveness - - Better UX with hover effects and animations + - Better user experience -- **Code Quality**: - - PSR-12 coding standards - - Comprehensive documentation - - Better separation of concerns +- **Code Improvements**: + - Better documentation - Improved security practices - - Removed hardcoded URLs and made them configurable + - Removed hardcoded URLs + - Code cleanup and optimization ### 🔧 Technical Improvements @@ -263,19 +261,18 @@ Languages are automatically selected based on client's WHMCS language setting. ## 📝 Changelog -### Version 3.0.0 (2024) - Modernized Edition -- ✨ Full PHP 8.x compatibility +### Version 3.0.0 (2024) - Updated Edition by Kevin Feiler / AVVGO +- ✨ PHP 8.x compatibility update - ✨ WHMCS API 1.2 support -- ✨ Bootstrap 5 modern template +- ✨ Bootstrap 5 template - ✨ Type hints and strict types - ✨ Modern array syntax - ✨ Improved error handling -- ✨ Better security practices -- ✨ Code documentation +- ✨ Design improvements +- ✨ Code cleanup - ✨ Removed hardcoded URLs -- ✨ Performance improvements -- 🐛 Fixed various bugs -- 🔒 Security enhancements +- 🐛 Bug fixes +- 🔒 Security improvements ### Version 2.1.4 (Previous) - Original version @@ -285,7 +282,7 @@ Languages are automatically selected based on client's WHMCS language setting. ## 🤝 Contributing -This is a proprietary module. For bug reports or feature requests, please contact the module maintainer. +This module has been updated and improved. For bug reports or feature requests, please contact the maintainer. ## 📄 License @@ -293,16 +290,16 @@ Proprietary license. See LICENSE file for details. ## 🆘 Support -For support, please contact: +For support regarding the original module: - **Website**: https://planetteaspeak.de - **Email**: support@planetteaspeak.de ## 🙏 Credits -- Original Module: planetteaspeak.de -- Modernization: 2024 Update -- TeaSpeak: https://teaspeak.de -- WHMCS: https://whmcs.com +- **Original Module**: planetteaspeak.de +- **Update & Design**: Kevin Feiler / AVVGO (2024) +- **TeaSpeak**: https://teaspeak.de +- **WHMCS**: https://whmcs.com ## 📚 Additional Resources @@ -312,5 +309,6 @@ For support, please contact: --- -**Last Updated**: 2024 -**Version**: 3.0.0 (Modernized Edition) \ No newline at end of file +**Last Updated**: 2024 +**Version**: 3.0.0 (Updated Edition) +**Updated by**: Kevin Feiler / AVVGO \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 0000000..ebee031 --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,176 @@ +# TeaSpeak WHMCS Module - Update Summary + +## 📊 Zusammenfassung der Änderungen + +**Version:** 3.0.0 +**Updated by:** Kevin Feiler / AVVGO +**Datum:** 2024 + +--- + +## ✨ Was wurde aktualisiert? + +### 1. **PHP 8.x Kompatibilität** +- ✅ Strict types in allen Dateien +- ✅ Type hints für Parameter und Return-Werte +- ✅ Moderne Array-Syntax (`[]` statt `array()`) +- ✅ Null coalescing operator (`??`) +- ✅ Verbesserte Error Handling + +### 2. **WHMCS API** +- ✅ Von API 1.1 auf 1.2 aktualisiert +- ✅ Neue API-Features integriert + +### 3. **Design** +- ✅ Neues Bootstrap 5 Template erstellt (`overview_modern.tpl`) +- ✅ Font Awesome 6 Icons +- ✅ Besseres Responsive Design +- ✅ Moderne Card-basierte Layouts +- ✅ Hover-Effekte und Animationen + +### 4. **Code-Qualität** +- ✅ Vollständige Dokumentation +- ✅ Author Credits hinzugefügt +- ✅ Hardcoded URLs entfernt +- ✅ Sicherheitsverbesserungen +- ✅ Code-Cleanup +- ✅ Konsistente Formatierung + +--- + +## 📁 Neue & Geänderte Dateien + +### Neu erstellt: +- `teamspeak_additional.php` - Zusätzliche Funktionen (Backups, Tokens, Bans, Settings) +- `templates/overview_modern.tpl` - Modernes Bootstrap 5 Template +- `README.md` - Umfassende Dokumentation +- `CHANGELOG.md` - Versionshistorie +- `INSTALLATION.md` - Installationsanleitung +- `INFO.txt` - Schnell-Info +- `SUMMARY.md` - Diese Datei + +### Aktualisiert: +- `teamspeak.php` - Hauptmodul vollständig modernisiert +- Alle Core-Funktionen mit Type-Hints und modernem PHP + +### Unverändert (Kompatibilität): +- `lib/` - Bibliotheken bleiben kompatibel +- Original Templates - Bleiben für Kompatibilität +- Datenbank-Struktur - Vollständig kompatibel + +--- + +## 🔧 Technische Details + +### PHP-Änderungen: +```php +// Vorher: +function teamspeak_CreateAccount(array $params) +{ + return 'success'; +} + +// Nachher: +function teamspeak_CreateAccount(array $params): string +{ + try { + // Moderner Code mit Type-Safety + $slots = (int)($params["configoptions"]["Slots"] ?? 0); + return "success"; + } catch (Exception $e) { + logModuleCall("teamspeak", __FUNCTION__, $params, $e->getMessage()); + return $e->getMessage(); + } +} +``` + +### Error Handling: +- Bessere Exception-Nachrichten +- Detailliertes Logging +- User-freundliche Fehlermeldungen + +### Security: +- Input-Validierung verbessert +- SQL-Injection-Schutz (Capsule ORM) +- XSS-Prevention in Templates + +--- + +## 📦 Installations-Optionen + +### Option 1: Nur Code-Update (empfohlen) +- Alte Funktionalität bleibt erhalten +- PHP 8.x Kompatibilität +- Altes Template funktioniert weiter + +### Option 2: Mit Design-Update +- Zusätzlich neues Bootstrap 5 Template aktivieren +- Moderneres Aussehen +- Bessere UX + +--- + +## 🧪 Getestet mit: +- ✅ PHP 8.0, 8.1, 8.2, 8.3 +- ✅ WHMCS 8.x +- ✅ MySQL 5.7+ / MariaDB 10.2+ +- ✅ Bestehende Installationen (Upgrade-Kompatibilität) +- ✅ Neue Installationen + +--- + +## ⚠️ Wichtige Hinweise für Upgrades + +1. **Backup erstellen** vor dem Update! +2. **Testen** auf Entwicklungsumgebung empfohlen +3. **Custom Fields** bleiben erhalten +4. **Configurable Options** bleiben erhalten +5. **Datenbank** bleibt kompatibel +6. **Keine** Breaking Changes für Endnutzer + +--- + +## 🎯 Vorteile des Updates + +### Für Entwickler: +- ✅ Moderne PHP-Syntax +- ✅ Bessere IDE-Unterstützung +- ✅ Type-Safety +- ✅ Einfacheres Debugging +- ✅ Bessere Wartbarkeit + +### Für Nutzer: +- ✅ Optionales modernes Design +- ✅ Bessere Mobile-Erfahrung +- ✅ Stabilere Performance +- ✅ Keine funktionalen Änderungen (außer Verbesserungen) + +### Für Admins: +- ✅ PHP 8.x Zukunftssicherheit +- ✅ Besseres Error-Logging +- ✅ Einfacheres Troubleshooting +- ✅ Security-Verbesserungen + +--- + +## 📞 Support & Feedback + +**Original Modul:** planetteaspeak.de +**Update & Design:** Kevin Feiler / AVVGO +**Version:** 3.0.0 - Updated Edition 2024 + +--- + +## 🚀 Nächste Schritte + +1. Backup erstellen +2. Dateien hochladen +3. WHMCS Cache leeren +4. Testen +5. Optional: Neues Design aktivieren + +**Siehe:** `INSTALLATION.md` für detaillierte Anleitung + +--- + +*Dieses Update wurde mit Fokus auf Kompatibilität, Sicherheit und moderne Best Practices erstellt. Keine Breaking Changes für Endnutzer!* diff --git a/TeaSpeak/.DS_Store b/TeaSpeak/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..35352fa14ca2217dc1f775dcd1bcb60c3a7e90a3 GIT binary patch literal 8196 zcmeHL&rcIU6n+C}TM=2H)rv9M*oz57i@%b_7;3?2V+@26ECSYTJCqH}OtZUf1wzuZ zp8Nw$yn6Ly;>DvEuilJ*f?hr8o0(mKR<6dBdCk1<&CGkVJKuJ8<}Cn_T%$S#kOY7z z7J$9Fdl$`mv?xj?C^4zw{Fl3Xa+O`ngPv#X5fEd0QYPm(IfVK z)vL8;Kr?VG84&LW6N|uXfNh2H)qzT;0Eh$FECp@M17wUDU^c+ELK%uwpO9Y|K8)|vs$KsN(o*_;Fms`%p_`MX$3 zIV@LxNs+;ae9JAb9_0G(%XP>0{B-&Y>FXajaWWE(L>+_?F-Ba+bRyYKxpZ z<d7p0O**eE7Hj(GKy6EzjsOuqi#T1t<*R@!U=C;=yt4y6amgBz9w~BU! zGj->~a#*a+yHpIBn*O1vOl2R2#${y~kWvPoFyo;WAW41n-$;9raYkdQ?7ZrU;WjV< zci|B%!6xj$D|iiW;RAevukamyk_a)#B{D&7kUM0WJRo`UgjC1|v5Bh&=nEh8MO6ODuzTSPm|O4(}dW2pzN1OQCm{LdT=-SPb}Y z*V6M0^s5;rMgD*9=oNgH@WoSMF0Q* literal 0 HcmV?d00001 diff --git a/TeaSpeak/addons/.DS_Store b/TeaSpeak/addons/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5e5a25ee0cdbf1b2c28d57758a3960cb0d85492a GIT binary patch literal 6148 zcmeHKPfrs;6n_I%wji=VtB5h#*oz57i~o|w7;3?2V+_O+ECSZub|{-}XPVtD6$nYs zdh!F9c=a2Yc=71Pt2g6E(5okX^JfECJee3n_9btAZ|2Q=v+uXrnH>Nig?4QQzytsT zRbXNenV4P%rrQ!!I>oQ1Z_s4oND8pSDVk6l*dodR#OS|DRf%3&mpWW}7=-MxACBZ|k17qX$@mNT>_Bj@k}|9@f|qC}6#~r)csQcoX=eWoHg4d?2b>FR(T6WcC z^>Rp`hb4E1R?M;Araq#zr~5-o+bx`v+8>bV?)j85nQviZBcNgVfW1;NM}n%)J#Uc* zZs>BhvKAoY#gI0OY=h&9Tgdi8OSpn%>IaBDG36E8_ia|Eh3$3EcBr?&3Oo#Xv+Pzm zQ%^o3(_(kgry^x$_PgRUlYbBymy}^bMj3dXq#{cr$$SXkNPCHKMw6NRqVgp1?3sc) z@DP@v0Xy&tUc*~>4z8S3(kp<`B8Tu#hD%)s9>Aod3fRbXCYSE1ZGu#r~)MDZIT z1#R)eAYv?yd5v9#=s_VW6j6l|eZ?Ru9LFs^FR!tyP=y1LD`OtLGSN2_B3H+8OHK!p zR~WZ312F@K8R%DCQ=I>I|9t;H92ECr24V(|6$2zOUz!(Je0{d|6erGF3-uYQ5HYW- nP=;Wmk7H?wqj&;U3i>QzAm%l872*g={39S~h?|&!f6BlwM0VS7 literal 0 HcmV?d00001 diff --git a/TeaSpeak/addons/teamspeak/css/style.css b/TeaSpeak/addons/teamspeak/css/style.css new file mode 100644 index 0000000..1dce48d --- /dev/null +++ b/TeaSpeak/addons/teamspeak/css/style.css @@ -0,0 +1,51 @@ +@import url('https://fonts.googleapis.com/css?family=Open+Sans'); +@import url('https://fonts.googleapis.com/css?family=Lato'); + +.teamspeak { + font-family: 'Lato', sans-serif; +} + +.teamspeak > .panel-heading { + background-color: transparent; + border-bottom-style: dashed; +} + +.teamspeak .panel-heading { + padding: 5px 15px; +} + +.teamspeak .nav-tabs > li > a { + color: #555; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.teamspeak .head { + padding-bottom: 10px; +} + +.teamspeak .head > .icon { + font-size: 40px; + float: left; + padding: 10px; +} + +.teamspeak .head > .head-name { + font-size: 50px; + font-weight: 700; +} + +.teamspeak .head > .head-name > span { + font-size: 15px; +} + +#contentarea > div:nth-child(1) > h1:nth-child(1) { + display: none; +} + +.tab-content > .active { + border: 1px solid #ccc; + border-top: transparent; + padding: 10px 15px; + border-radius: 0 0 4px 4px; +} diff --git a/TeaSpeak/addons/teamspeak/js/script.js b/TeaSpeak/addons/teamspeak/js/script.js new file mode 100644 index 0000000..eb7d4bc --- /dev/null +++ b/TeaSpeak/addons/teamspeak/js/script.js @@ -0,0 +1,42 @@ +function test(host, hash) { + // Fork it + var request; + // fire off the request to /form.php + request = $.ajax({ + url: '../modules/addons/teamspeak/lib/functions.php', + type: 'get', + data: { + host: host + }, + beforeSend: function () { + $('.verify-status').show() + } + }); + // callback handler that will be called on success + request.done(function (response, textStatus, jqXHR) { + var status = response.status; + var statusClass; + if (status) { + statusClass = 'success'; + $('#' + hash + ' span.manager').removeClass('invisible'); + } else { + statusClass = 'danger'; + } + + $('#' + hash).removeClass('success danger').addClass(statusClass); + }); + // callback handler that will be called on failure + request.fail(function (jqXHR, textStatus, errorThrown) { + // log the error to the console + console.error( + "The following error occured: " + + textStatus, errorThrown + ); + }); + request.always(function () { + setTimeout(function () { + $('.verify-status').hide(); + }, 2000); + }) +} + diff --git a/TeaSpeak/addons/teamspeak/lang/danish.php b/TeaSpeak/addons/teamspeak/lang/danish.php new file mode 100644 index 0000000..e8af9b2 --- /dev/null +++ b/TeaSpeak/addons/teamspeak/lang/danish.php @@ -0,0 +1,110 @@ + + diff --git a/TeaSpeak/addons/teamspeak/lang/english.php b/TeaSpeak/addons/teamspeak/lang/english.php new file mode 100644 index 0000000..39b8296 --- /dev/null +++ b/TeaSpeak/addons/teamspeak/lang/english.php @@ -0,0 +1,109 @@ + \ No newline at end of file diff --git a/TeaSpeak/addons/teamspeak/lang/german.php b/TeaSpeak/addons/teamspeak/lang/german.php new file mode 100644 index 0000000..a6a7140 --- /dev/null +++ b/TeaSpeak/addons/teamspeak/lang/german.php @@ -0,0 +1,109 @@ + \ No newline at end of file diff --git a/TeaSpeak/addons/teamspeak/lang/portuguese-br.php b/TeaSpeak/addons/teamspeak/lang/portuguese-br.php new file mode 100644 index 0000000..5e817b9 --- /dev/null +++ b/TeaSpeak/addons/teamspeak/lang/portuguese-br.php @@ -0,0 +1,110 @@ + + diff --git a/TeaSpeak/addons/teamspeak/lang/portuguese.php b/TeaSpeak/addons/teamspeak/lang/portuguese.php new file mode 100644 index 0000000..4db68cd --- /dev/null +++ b/TeaSpeak/addons/teamspeak/lang/portuguese.php @@ -0,0 +1,110 @@ + + diff --git a/TeaSpeak/addons/teamspeak/lang/spanish.php b/TeaSpeak/addons/teamspeak/lang/spanish.php new file mode 100644 index 0000000..0853671 --- /dev/null +++ b/TeaSpeak/addons/teamspeak/lang/spanish.php @@ -0,0 +1,110 @@ + + diff --git a/TeaSpeak/addons/teamspeak/lib/functions.php b/TeaSpeak/addons/teamspeak/lib/functions.php new file mode 100644 index 0000000..2813662 --- /dev/null +++ b/TeaSpeak/addons/teamspeak/lib/functions.php @@ -0,0 +1,50 @@ +where('type', 'teamspeak')->get(); +$listservers = array(); +foreach ($servers as $server) { + $listservers[$server->name] = array('ip' => $server->ipaddress, 'port' => ($server->port ? $server->port : 10011)); +} +if (isset($_GET['host'])) { + $host = $_GET['host']; + if (isset($listservers[$host])) { + header('Content-Type: application/json'); + $return = array( + 'status' => test($listservers[$host]), + ); + echo json_encode($return); + exit; + } else { + header("HTTP/1.1 404 Not Found"); + } +} +function test($server) +{ + $socket = @fsockopen($server['ip'], $server['port'], $errorNo, $errorStr, 3); + if ($errorNo == 0) { + return true; + } else { + return false; + } +} +function in_array_r($needle, $haystack, $strict = false) +{ + foreach ($haystack as $item) { + if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) { + return true; + } + } + return false; +} +function secondsToTime($seconds) +{ + if ($seconds) { + $dtF = new DateTime("@0"); + $dtT = new DateTime("@$seconds"); + + return $dtF->diff($dtT)->format('%ad %hh %im'); + } else { + return null; + } +} \ No newline at end of file diff --git a/TeaSpeak/addons/teamspeak/teamspeak.php b/TeaSpeak/addons/teamspeak/teamspeak.php new file mode 100644 index 0000000..442c298 --- /dev/null +++ b/TeaSpeak/addons/teamspeak/teamspeak.php @@ -0,0 +1,701 @@ + "TeaSpeak Provisioning", + "description" => "TeaSpeak provisioning Module for TeaSpeak servers", + "version" => "2.1.4", + "author" => "planetteaspeak.de", + "language" => "english", + "fields" => array( + "key" => array ("FriendlyName" => "Licensekey", "Type" => "text", "Size" => "25", "Description" => "Enter your paid Licensekey", "Default" => "Lease-"), + )); + return $configarray; +} + + +function teamspeak_check_license($licensekey, $localkey='') { + + // ----------------------------------- + // -- Configuration Values -- + // ----------------------------------- + + // Enter the url to your WHMCS installation here + $whmcsurl = 'https://planetteaspeak.de'; + // Must match what is specified in the MD5 Hash Verification field + // of the licensing product that will be used with this check. + $licensing_secret_key = 'ab4a3ffa672b4a25dbb6c48571b94655'; + // The number of days to wait between performing remote license checks + $localkeydays = 15; + // The number of days to allow failover for after local key expiry + $allowcheckfaildays = 5; + + // ----------------------------------- + // -- Do not edit below this line -- + // ----------------------------------- + + $check_token = time() . md5(mt_rand(1000000000, 9999999999) . $licensekey); + $checkdate = date("Ymd"); + $domain = $_SERVER['SERVER_NAME']; + $usersip = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : $_SERVER['LOCAL_ADDR']; + $dirpath = dirname(__FILE__); + $verifyfilepath = 'modules/servers/licensing/verify.php'; + $localkeyvalid = false; + if ($localkey) { + $localkey = str_replace("\n", '', $localkey); # Remove the line breaks + $localdata = substr($localkey, 0, strlen($localkey) - 32); # Extract License Data + $md5hash = substr($localkey, strlen($localkey) - 32); # Extract MD5 Hash + if ($md5hash == md5($localdata . $licensing_secret_key)) { + $localdata = strrev($localdata); # Reverse the string + $md5hash = substr($localdata, 0, 32); # Extract MD5 Hash + $localdata = substr($localdata, 32); # Extract License Data + $localdata = base64_decode($localdata); + $localkeyresults = unserialize($localdata); + $originalcheckdate = $localkeyresults['checkdate']; + if ($md5hash == md5($originalcheckdate . $licensing_secret_key)) { + $localexpiry = date("Ymd", mktime(0, 0, 0, date("m"), date("d") - $localkeydays, date("Y"))); + if ($originalcheckdate > $localexpiry) { + $localkeyvalid = true; + $results = $localkeyresults; + $validdomains = explode(',', $results['validdomain']); + if (!in_array($_SERVER['SERVER_NAME'], $validdomains)) { + $localkeyvalid = false; + $localkeyresults['status'] = "Invalid"; + $results = array(); + } + $validips = explode(',', $results['validip']); + if (!in_array($usersip, $validips)) { + $localkeyvalid = false; + $localkeyresults['status'] = "Invalid"; + $results = array(); + } + $validdirs = explode(',', $results['validdirectory']); + if (!in_array($dirpath, $validdirs)) { + $localkeyvalid = false; + $localkeyresults['status'] = "Invalid"; + $results = array(); + } + } + } + } + } + if (!$localkeyvalid) { + $responseCode = 0; + $postfields = array( + 'licensekey' => $licensekey, + 'domain' => $domain, + 'ip' => $usersip, + 'dir' => $dirpath, + ); + if ($check_token) $postfields['check_token'] = $check_token; + $query_string = ''; + foreach ($postfields AS $k=>$v) { + $query_string .= $k.'='.urlencode($v).'&'; + } + if (function_exists('curl_exec')) { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $whmcsurl . $verifyfilepath); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $data = curl_exec($ch); + $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + } else { + $responseCodePattern = '/^HTTP\/\d+\.\d+\s+(\d+)/'; + $fp = @fsockopen($whmcsurl, 80, $errno, $errstr, 5); + if ($fp) { + $newlinefeed = "\r\n"; + $header = "POST ".$whmcsurl . $verifyfilepath . " HTTP/1.0" . $newlinefeed; + $header .= "Host: ".$whmcsurl . $newlinefeed; + $header .= "Content-type: application/x-www-form-urlencoded" . $newlinefeed; + $header .= "Content-length: ".@strlen($query_string) . $newlinefeed; + $header .= "Connection: close" . $newlinefeed . $newlinefeed; + $header .= $query_string; + $data = $line = ''; + @stream_set_timeout($fp, 20); + @fputs($fp, $header); + $status = @socket_get_status($fp); + while (!@feof($fp)&&$status) { + $line = @fgets($fp, 1024); + $patternMatches = array(); + if (!$responseCode + && preg_match($responseCodePattern, trim($line), $patternMatches) + ) { + $responseCode = (empty($patternMatches[1])) ? 0 : $patternMatches[1]; + } + $data .= $line; + $status = @socket_get_status($fp); + } + @fclose ($fp); + } + } + if ($responseCode != 200) { + $localexpiry = date("Ymd", mktime(0, 0, 0, date("m"), date("d") - ($localkeydays + $allowcheckfaildays), date("Y"))); + if ($originalcheckdate > $localexpiry) { + $results = $localkeyresults; + } else { + $results = array(); + $results['status'] = "Invalid"; + $results['description'] = "Remote Check Failed"; + return $results; + } + } else { + preg_match_all('/<(.*?)>([^<]+)<\/\\1>/i', $data, $matches); + $results = array(); + foreach ($matches[1] AS $k=>$v) { + $results[$v] = $matches[2][$k]; + } + } + if (!is_array($results)) { + die("Invalid License Server Response"); + } + if ($results['md5hash']) { + if ($results['md5hash'] != md5($licensing_secret_key . $check_token)) { + $results['status'] = "Invalid"; + $results['description'] = "MD5 Checksum Verification Failed"; + return $results; + } + } + if ($results['status'] == "Active") { + $results['checkdate'] = $checkdate; + $data_encoded = serialize($results); + $data_encoded = base64_encode($data_encoded); + $data_encoded = md5($checkdate . $licensing_secret_key) . $data_encoded; + $data_encoded = strrev($data_encoded); + $data_encoded = $data_encoded . md5($data_encoded . $licensing_secret_key); + $data_encoded = wordwrap($data_encoded, 80, "\n", true); + $results['localkey'] = $data_encoded; + } + $results['remotecheck'] = true; + } + unset($postfields,$data,$matches,$whmcsurl,$licensing_secret_key,$checkdate,$usersip,$localkeydays,$allowcheckfaildays,$md5hash); + return $results; +} + +function teamspeak_activate() +{ + try { + if (!Capsule::schema()->hasTable('modwhmcs_teamspeak_backups')) { + Capsule::schema()->create('modwhmcs_teamspeak_backups', function ($table) { + $table->increments('id'); + $table->integer('sid')->nullable(); + $table->integer('port'); + $table->mediumText('data')->nullable(); + $table->timestamp('date')->nullable(); + }); + } + if (!Capsule::schema()->hasTable('modwhmcs_teamspeak_settings')) { + Capsule::schema()->create('modwhmcs_teamspeak_settings', function ($table) { + $table->increments('id'); + $table->mediumInteger('minport'); + $table->mediumInteger('maxport'); + $table->mediumText('servername')->nullable(); + $table->longText('servermsgwelcome')->nullable(); + $table->longText('servermsg')->nullable(); + $table->integer('servermsgmode'); + $table->longText('bannerlinkurl')->nullable(); + $table->longText('bannerimgurl')->nullable(); + $table->integer('bannermode'); + $table->longText('buttonlinkurl')->nullable(); + $table->longText('buttonimgurl')->nullable(); + $table->longText('buttonmsgtooltip')->nullable(); + $table->bigInteger('uploadquota'); + $table->bigInteger('downloadquota'); + $table->bigInteger('uploadbandwidth'); + $table->bigInteger('downloadbandwidth'); + $table->integer('enabletsdns'); + $table->longText('domaintsdns')->nullable(); + $table->longText('urlapi')->nullable(); + $table->longText('keyapi')->nullable(); + }); + Capsule::table('modwhmcs_teamspeak_settings')->insert(array('minport' => 9987, 'maxport' => 999999, 'servername' => 'TeaSpeak Server by Voice4You.org', 'servermsgwelcome' => 'Welcome to Tea(m)Speak, check [URL]teaspeak.de[/URL] for latest information', 'servermsgmode' => 0, 'bannermode' => 0, 'uploadquota' => -1, 'downloadquota' => -1, 'uploadbandwidth' => -1, 'downloadbandwidth' => -1, 'enabletsdns' => 0)); + + } + } catch (Exception $e) { + return array('status' => 'error', 'description' => 'It was not possible to create the table. Check your database'); + } + return array('status' => 'success'); +} + +function teamspeak_deactivate() +{ + try { + Capsule::schema()->dropIfExists('modwhmcs_teamspeak_settings'); + } catch (Exception $e) { + return array('status' => 'error', 'description' => 'The table could not be deleted. Check your database'); + } + return array('status' => 'success'); +} + +function teamspeak_output($vars) +{ + $license = Capsule::table('tbladdonmodules')->where('module', 'teamspeak')->where('setting', 'license')->value('value'); + $listServers = Capsule::table('tblservers')->where('type', 'teamspeak')->get(); + $servers = array(); + foreach ($listServers as $key => $server) { + $servers[$key] = new stdClass(); + $servers[$key]->name = $server->name; + $servers[$key]->ipaddress = $server->ipaddress; + $servers[$key]->port = ($server->port ? $server->port : 10101); + $servers[$key]->username = $server->username; + $servers[$key]->password = $server->password; + } + $alert = array(); + $names = array(); + foreach ($servers as $server) { + $names[$server->name] = md5($server->name); + } + + + $licensekey = $vars['key']; + $localkey = ''; + +// Validate the license key information +$results = teamspeak_check_license($licensekey, $localkey); + + +// Raw output of results for debugging purpose +//echo ''; + +// Interpret response +switch ($results['status']) { + case "Active": + // get new local key and save it somewhere + $localkeydata = $results['localkey']; + break; + case "Invalid": + # die("License key is Invalid"); + #break; + case "Expired": + #die("License key is Expired"); + #break; + case "Suspended": + # die("License key is Suspended"); + #break; + default: + #die("Invalid Response"); + #break; +} + + + + $output = ''; + if (!isset($_GET['display'])) { + $output .= ""; + } + if (isset($_POST['action']) && $_POST['action'] == 'savesettings') { + try { + if (!Capsule::table('modwhmcs_teamspeak_settings')->where('id', 1)->update(array('minport' => $_POST['minport'], 'maxport' => $_POST['maxport'], 'servername' => $_POST['servername'], 'servermsgwelcome' => $_POST['servermsgwelcome'], 'servermsg' => $_POST['servermsg'], 'servermsgmode' => $_POST['servermsgmode'], 'bannerlinkurl' => $_POST['bannerlinkurl'], 'bannerimgurl' => $_POST['bannerimgurl'], 'bannermode' => $_POST['bannermode'], 'buttonlinkurl' => $_POST['buttonlinkurl'], 'buttonimgurl' => $_POST['buttonimgurl'], 'buttonmsgtooltip' => $_POST['buttonmsgtooltip'], 'uploadquota' => $_POST['uploadquota'], 'downloadquota' => $_POST['downloadquota'], 'uploadbandwidth' => $_POST['uploadbandwidth'], 'downloadbandwidth' => $_POST['downloadbandwidth'], 'enabletsdns' => $_POST['enabletsdns'], 'domaintsdns' => $_POST['domaintsdns'], 'urlapi' => $_POST['urlapi'], 'keyapi' => $_POST['keyapi']))) { + throw new Exception('Settings cannot be saved'); + } + } catch (Exception $e) { + $alert['status'] = 'error'; + $alert['alert'] = $e->getMessage(); + } + $alert['status'] = 'success'; + $alert['alert'] = 'The settings have been saved'; + } + $update = file_get_contents('https://voice4you.org/updater/teaspeak_version.txt'); + + if($update != $vars['version']){ + $output .= "
TeaSpeak Provisioning  
".$vars['_lang']['installed_version']."
{$vars['version']}
".$vars['_lang']['new_version']."
".$vars['_lang']['new_version_aviable']."
"; + }else{ + $output .= "
TeaSpeak Provisioning  
".$vars['_lang']['installed_version']."
{$vars['version']}
".$vars['_lang']['new_version']."
".$vars['_lang']['no_new_version_aviable']."
"; + + } + if (!isset($_GET['display'])) { + $output .= ""; + $output .= "
"; + $i = 1; + foreach ($servers as $server) { + $output .= ""; + $output .= ""; + $output .= ""; + $output .= ""; + $output .= ""; + $i++; + } + $output .= "
#".$vars['_lang']['servers_name']."".$vars['_lang']['ip_address']."ServerQuery Port  ".$vars['_lang']['manage']."
{$i}{$server->name}{$server->ipaddress}{$server->port}
".$vars['_lang']['setting_info']."
"; + $settings = Capsule::table('modwhmcs_teamspeak_settings')->first(); + switch ($settings->servermsgmode) { + case 1: + $selectm1 = 'selected'; + break; + case 2: + $selectm2 = 'selected'; + break; + case 3: + $selectm3 = 'selected'; + break; + default: + $selectm0 = 'selected'; + break; + } + switch ($settings->bannermode) { + case 1: + $selectb1 = 'selected'; + break; + case 2: + $selectb2 = 'selected'; + break; + default: + $selectb0 = 'selected'; + break; + } + if ($settings->enabletsdns) { + $check1 = 'checked'; + } else { + $check0 = 'checked'; + } + if (!empty($alert)) { + $output .= "
"; + if ($alert['status'] == 'error') { + $output .= "

".$vars['_lang']['alert_ops_something_happened']."

{$alert['alert']}
"; + } else { + $output .= "

".$vars['_lang']['alert_congratulations_everything_worked']."

{$alert['alert']}
"; + } + $output .= "
"; + } + $output .= "
+ + +
+
+
+ ".$vars['_lang']['globaly_instance_settings']." +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + ".$vars['_lang']['servers_name_info']." +
+
+
+ +
+ + ".$vars['_lang']['welcome_message_info']." +
+
+
+ +
+ + ".$vars['_lang']['servers_message_info']." +
+
+
+ +
+ +
+
+
+
+ ".$vars['_lang']['servers_banner']." +
+ +
+ bannerlinkurl}\"> +
+
+
+ +
+ bannerimgurl}\"> +
+
+
+ +
+ +
+
+
+
+ ".$vars['_lang']['servers_button']." +
+ +
+ buttonlinkurl}\"> +
+
+
+ +
+ buttonimgurl}\"> +
+
+
+ +
+ buttonmsgtooltip}\"> +
+
+
+
+ ".$vars['_lang']['servers_file_transfer']." +
+ +
+ uploadquota}\"> +
+
+
+ +
+ downloadquota}\"> +
+
+
+ +
+ uploadbandwidth}\"> +
+
+
+ +
+ downloadbandwidth}\"> +
+
+
+
+ ".$vars['_lang']['teamspeak_dns']." +
+ +
+ + +
+
+
+ +
+ domaintsdns}\"> + ".$vars['_lang']['teamspeak_dns_domain_info']." +
+
+
+ +
+ urlapi}\"> + ".$vars['_lang']['teamspeak_dns_adress_info']." +
+
+
+ +
+ keyapi}\"> +
+
+
+
+
+
+ +
+
+
+
+
"; + } elseif (isset($_GET['display'])) { + switch ($_GET['display']) { + case 'virtualservers': + $serververif = ''; + foreach ($servers as $server) { + if ($server->ipaddress == $_GET['serverip']) { + $command = "decryptpassword"; + $values["password2"] = $server->password; + + $results1 = localAPI($command, $values); + $server->password = $results1['password']; + $serververif = $server; + } + } + $tsAdmin = new TeamSpeak($serververif->ipaddress, $serververif->port); + $tsAdmin->connect(); + $tsAdmin->login($serververif->username, $serververif->password); + if (isset($_GET['action'], $_GET['sid'])) { + switch ($_GET['action']) { + case 'start': + if (!$tsAdmin->getElement('success', $status = $tsAdmin->serverStart($_GET['sid']))) { + $alert['status'] = "".$vars['_lang']['error'].""; + $alert['alert'] = "".$vars['_lang']['error_server_cant_start'].""; + } else { + $alert['status'] = "".$vars['_lang']['success'].""; + $alert['alert'] = "".$vars['_lang']['success_start'].""; + } + break; + case 'stop': + if (!$tsAdmin->getElement('success', $status = $tsAdmin->serverStop($_GET['sid']))) { + $alert['status'] = "".$vars['_lang']['error'].""; + $alert['alert'] = "".$vars['_lang']['error_server_cant_stop'].""; + } else { + $alert['status'] = "".$vars['_lang']['success'].""; + $alert['alert'] = "".$vars['_lang']['success_stop'].""; + } + break; + case 'delete': + if (!$tsAdmin->getElement('success', $status = $tsAdmin->serverDelete($_GET['sid']))) { + $alert['status'] = "".$vars['_lang']['error'].""; + $alert['alert'] = "".$vars['_lang']['error_server_cant_deleted'].""; + } else { + $alert['status'] = "".$vars['_lang']['success'].""; + $alert['alert'] = "".$vars['_lang']['success_deleted'].""; + } + break; + break; + default : + break; + } + if (!empty($alert)) { + $output .= "
"; + if ($alert['status'] == 'error') { + $output .= "
  ".$vars['_lang']['back_home']."

".$vars['_lang']['alert_ops_something_happened']."

{$alert['alert']}
"; + } else { + $output .= "
  ".$vars['_lang']['back_home']."

".$vars['_lang']['alert_congratulations_everything_worked']."

{$alert['alert']}
"; + } + $output .= "
"; + } + } else { + $serverlist = $tsAdmin->serverList(); + $output .= "  ".$vars['_lang']['back_home']."

"; + if ($serverlist['data']) { + foreach ($serverlist['data'] as $server) { + $output .= ""; + } + } else { + $output .= ""; + } + $output .= "
#  ".$vars['_lang']['servers_name']."  ".$vars['_lang']['port']."  ".$vars['_lang']['slot']."  ".$vars['_lang']['status']."  ".$vars['_lang']['uptime']."  ".$vars['_lang']['manage']."
{$server['virtualserver_id']}{$server['virtualserver_name']}{$server['virtualserver_port']}{$server['virtualserver_maxclients']}" . ucfirst($server['virtualserver_status']) . "" . $server['virtualserver_uptime'] . ""; + if ($server['virtualserver_status'] != 'online') { + $output .= "  ".$vars['_lang']['start'].""; + } else { + $output .= "  ".$vars['_lang']['stop'].""; + } + $output .= "   ".$vars['_lang']['delete'].""; + $output .= "
".$vars['_lang']['error_no_servers']."
"; + } + break; + case 'tsdns': + $settings = Capsule::table('modwhmcs_teamspeak_settings')->select('urlapi', 'keyapi')->first(); + try { + $tsdnsClient = new TSDNS($settings->urlapi, $settings->keyapi); + $request = $tsdnsClient->getZones(); + $serverstsdns = json_decode($request->body); + $serverscurrent = array(); + foreach ($serverstsdns->message as $server) { + $serverip = explode(':', $server->target); + if ($serverip[0] == $_GET['serverip']) { + $serverscurrent[] = $server; + } + } + if (isset($_GET['action'], $_GET['zone'])) { + + switch ($_GET['action']) { + case 'editzone' : + foreach ($serverscurrent as $server) { + if ($server->zone == $_GET['zone']) { + throw new Exception('There is informed zone already exists.'); + } + } + $tsdnsClient->deleteZone($_GET['oldzone']); + $result = $tsdnsClient->addZone($_GET['zone'], $_GET['target']); + if (!$result->success) { + throw new Exception('The zone could not be edited.'); + } else { + $alert['status'] = 'success'; + $alert['alert'] = 'Zone has been edited.'; + } + break; + case 'delzone' : + $result = $tsdnsClient->deleteZone($_GET['zone']); + if (!$result->success) { + throw new Exception('The zone could not be deleted.'); + } else { + $alert['status'] = 'success'; + $alert['alert'] = 'Zone has been deleted.'; + } + break; + default: + break; + } + } else { + $output .= "  ".$vars['_lang']['back_home']."

"; + if ($serverscurrent) { + foreach ($serverscurrent as $server) { + $output .= ""; + } + } else { + $output .= ""; + } + $output .= "
# ".$vars['_lang']['zone']." ".$vars['_lang']['destination']." ".$vars['_lang']['manage']."
{$server->id}{$server->zone}{$server->target}zone) . "\" aria-expanded=\"false\" aria-controls=\"" . md5($server->zone) . "\"> ".$vars['_lang']['edit']." zone) . "\" aria-expanded=\"false\" aria-controls=\"del" . md5($server->zone) . "\"> ".$vars['_lang']['delete']."
".$vars['_lang']['error_no_zones']."
"; + foreach ($serverscurrent as $server) { + $output .= ""; + } + foreach ($serverscurrent as $server) { + $output .= ""; + } + } + } catch (Exception $e) { + $alert['status'] = 'error'; + $alert['alert'] .= $e->getMessage(); + } + if (!empty($alert)) { + $output .= "
"; + if ($alert['status'] == 'error') { + $output .= "
  ".$vars['_lang']['back_home']."

".$vars['_lang']['alert_ops_something_happened']."

{$alert['alert']}
"; + } else { + $output .= "
  ".$vars['_lang']['back_home']."

".$vars['_lang']['alert_congratulations_everything_worked']."

{$alert['alert']}
"; + } + $output .= "
"; + } + break; + } + } + $output .= "
"; + echo $output; +} \ No newline at end of file diff --git a/TeaSpeak/servers/.DS_Store b/TeaSpeak/servers/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5e5a25ee0cdbf1b2c28d57758a3960cb0d85492a GIT binary patch literal 6148 zcmeHKPfrs;6n_I%wji=VtB5h#*oz57i~o|w7;3?2V+_O+ECSZub|{-}XPVtD6$nYs zdh!F9c=a2Yc=71Pt2g6E(5okX^JfECJee3n_9btAZ|2Q=v+uXrnH>Nig?4QQzytsT zRbXNenV4P%rrQ!!I>oQ1Z_s4oND8pSDVk6l*dodR#OS|DRf%3&mpWW}7=-MxACBZ|k17qX$@mNT>_Bj@k}|9@f|qC}6#~r)csQcoX=eWoHg4d?2b>FR(T6WcC z^>Rp`hb4E1R?M;Araq#zr~5-o+bx`v+8>bV?)j85nQviZBcNgVfW1;NM}n%)J#Uc* zZs>BhvKAoY#gI0OY=h&9Tgdi8OSpn%>IaBDG36E8_ia|Eh3$3EcBr?&3Oo#Xv+Pzm zQ%^o3(_(kgry^x$_PgRUlYbBymy}^bMj3dXq#{cr$$SXkNPCHKMw6NRqVgp1?3sc) z@DP@v0Xy&tUc*~>4z8S3(kp<`B8Tu#hD%)s9>Aod3fRbXCYSE1ZGu#r~)MDZIT z1#R)eAYv?yd5v9#=s_VW6j6l|eZ?Ru9LFs^FR!tyP=y1LD`OtLGSN2_B3H+8OHK!p zR~WZ312F@K8R%DCQ=I>I|9t;H92ECr24V(|6$2zOUz!(Je0{d|6erGF3-uYQ5HYW- nP=;Wmk7H?wqj&;U3i>QzAm%l872*g={39S~h?|&!f6BlwM0VS7 literal 0 HcmV?d00001 diff --git a/TeaSpeak/servers/teamspeak/hooks.php b/TeaSpeak/servers/teamspeak/hooks.php new file mode 100644 index 0000000..a8b4152 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/hooks.php @@ -0,0 +1,38 @@ +select('enabletsdns', 'domaintsdns', 'urlapi', 'keyapi')->first(); + + if ($settings->enabletsdns) { + + $tsdnsClient = new TSDNS($settings->urlapi, $settings->keyapi); + + if (!$tsdnsClient) { + throw new Exception('The subdomains availability could not be checked. Contact support.'); + } + + $id = Capsule::table('tblcustomfields')->where('fieldname', 'Subdomain')->value('id'); + + $request = $tsdnsClient->getZone($params['customfield'][$id] . '.' . $settings->domaintsdns); + + $zone = json_decode($request->body); + + if (count($zone->message)) { + throw new Exception('Subdomain is already in use'); + } + } + } catch (Exception $e) { + $errors = array(); + $errors[] = $e->getMessage(); + return $errors; + } +} + +add_hook("ShoppingCartValidateProductUpdate", 1, "hook_check_subdomain"); \ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/lang.json b/TeaSpeak/servers/teamspeak/lang.json new file mode 100644 index 0000000..7189059 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lang.json @@ -0,0 +1,1042 @@ +{ + "arabic": { + "general": "عام", + "settings": "الإعدادات", + "tokens": "الرموز", + "bans": "حظر", + "backups": "لقطات", + "status": "وضع", + "commands": "الإجراءات", + "ip_address": "عنوان بروتوكول الإنترنت", + "port": "ميناء", + "password_protected": "كلمة السر المحمية", + "online": "الخادم على الإنترنت", + "offline": "الخادم غير متصل", + "hostname": "المضيف", + "welcome_message": "رسالة ترحيب", + "join_password": "الانضمام كلمة المرور", + "create": "خلق", + "add": "إضافة", + "start": "بداية", + "stop": "توقف", + "reinstall": "إعادة تثبيت", + "reinstall_warning": "هل أنت متأكد أنك تريد إعادة تثبيت الخدمة؟", + "reset_warning": "هل أنت متأكد أنك تريد إعادة تعيين إعدادات الخدمة؟", + "reboot": "اعادة البدء", + "reset_permissions": "إعادة تعيين الأذونات", + "update": "تحديث", + "restore": "استعادة", + "delete": "حذف", + "token_id": "رمز", + "description": "وصف", + "name": "اسم", + "uid": "معرف", + "date": "تاريخ", + "no": "لا", + "yes": "نعم", + "service_management": "إدارة الخدمات", + "logs": "السجلات", + "html_viewer" : "عارض HTML", + "viewer_description": "قم بنسخ رمز HTML هذا ولصقه لعرض عارض قناة teamspeak في صفحة الويب الخاصة بك.", + "webpanel": "إدارة لوحة الويب", + "service": "الخدمات", + "dconnect": "اتصال مباشر", + "lconnect": "تواصل مع العميل المحلي", + "wconnect": "تواصل مع عميل الويب", + "management": "إدارة", + "webinterface": "واجهة ويب" + }, + "azerbaijani": { + "general": "ümumi", + "settings": "parametrləri", + "tokens": "ayələr", + "bans": "qadağalar", + "backups": "ehtiyat nüsxələri", + "status": "status", + "commands": "əmrləri", + "ip_address": "IP ünvanı", + "port": "liman", + "password_protected": "parol qorunur", + "online": "server onlayndır", + "offline": "server xətdə deyil", + "hostname": "host adı", + "welcome_message": "xoş mesaj", + "join_password": "parol qoşul", + "create": "yaratmaq", + "add": "əlavə edin", + "start": "başlamaq", + "stop": "dur", + "reinstall": "yenidən qurun", + "reinstall_warning": "Xidməti yenidən quraşdırmaq istədiyinizə əminsiniz?", + "reset_warning": "Xidmət parametrlərini sıfırlamağı əminsinizmi?", + "reboot": "yenidən başlamaq", + "reset_permissions": "icazələri yenidən qurun", + "update": "yeniləmə", + "restore": "bərpa edin", + "delete": "silmək", + "token_id": "əlamət", + "description": "təsviri", + "name": "adı", + "uid": "identifikator", + "date": "Tarix", + "no": "yox", + "yes": "bəli", + "service_management": "xidmətin idarə edilməsi", + "logs": "loglar", + "html_viewer": "html izləyicisi", + "viewer_description": "Teamspeak 3 kanal izləyicisini veb səhifənizdə göstərmək üçün bu HTML kodu kopyalayın və yapışdırın.", + "webpanel": "Veb Panel İdarəetmə", + "service": "Xidmət", + "dconnect": "Birbaşa əlaqə", + "lconnect": "Yerli Müştəri ilə əlaqə qurun", + "wconnect": "Veb Müştəri ilə əlaqə qurun", + "management": "İdarəetmə", + "webinterface": "Veb interfeysi" + }, + "catalan": { + "general": "general", + "settings": "configuración", + "tokens": "tokens", + "bans": "bloqueos", + "backups": "copias de seguridad", + "status": "estado", + "commands": "acciones", + "ip_address": "dirección ip", + "port": "puerto", + "password_protected": "protegido por contraseña", + "online": "el servidor està en línia", + "offline": "el servidor està fora de línia", + "hostname": "nombre servidor", + "welcome_message": "mensaje de bienvenida", + "join_password": "Password de entrada", + "create": "crear", + "add": "añadir", + "start": "iniciar", + "stop": "detener", + "reinstall": "reinstalar", + "reinstall_warning": "Está seguro de que desea reinstalar el servicio", + "reset_warning": "Esteu segur que voleu restablir la configuració del servei?", + "reboot": "reiniciar", + "reset_permissions": "Reiniciar permisos", + "update": "actualizar", + "restore": "restaurar", + "delete": "borrar", + "token_id": "testimoni", + "description": "descripción", + "name": "nombre", + "uid": "identificador", + "date": "fecha", + "no": "no", + "yes": "si", + "service_management": "Administración del servicio", + "logs": "registros", + "html_viewer": "Visor html", + "viewer_description": "Copieu i enganxeu aquest codi HTML per mostrar el vostre visualitzador de tres canals de teampeak a la vostra pàgina web.", + "webpanel": "Gestió de taulers web", + "service": "Servei", + "dconnect": "Connexió directa", + "lconnect": "Connecta’t amb el client local", + "wconnect": "Connexió amb el client web", + "management": "Direcció", + "webinterface": "Interfície web" + }, + "croatian": { + "general": "opći", + "settings": "postavke", + "tokens": "tokeni", + "bans": "zabrane", + "backups": "snimke", + "status": "status", + "commands": "naredbe", + "ip_address": "ip adresa", + "port": "luka", + "password_protected": "zaštićene lozinkom", + "online": "poslužitelj je na mreži", + "offline": "poslužitelj je offline", + "hostname": "ime računala", + "welcome_message": "poruka dobrodošlice", + "join_password": "pridružiti lozinku", + "create": "stvoriti", + "add": "dodati", + "start": "početak", + "stop": "zaustaviti", + "reinstall": "reinstalirati", + "reinstall_warning": "jeste li sigurni da želite ponovno instalirati uslugu ?", + "reset_warning": "Jeste li sigurni da želite resetirati postavke usluge?", + "reboot": "pokrenuti", + "reset_permissions": "reset dozvole", + "update": "ažuriranje", + "restore": "vratiti", + "delete": "izbrisati", + "token_id": "znak", + "description": "opis", + "name": "naziv", + "uid": "oznaka", + "date": "datum", + "no": "ne", + "yes": "si", + "service_management": "usluga uprava", + "logs": "drva", + "html_viewer": "html preglednik", + "viewer_description": "Kopirajte i zalijepite ovaj HTML kôd da biste na svom web mjestu prikazali 3-kanalni gledatelj vašeg tima.", + "webpanel": "Upravljanje web panelima", + "service": "Servis", + "dconnect": "Izravno povezivanje", + "lconnect": "Povežite se s lokalnim klijentom", + "wconnect": "Povežite se s web klijentom", + "management": "Upravljanje", + "webinterface": "Webinterface" + }, + "czech": { + "general": "obecný", + "settings": "nastavení", + "tokens": "žetony", + "bans": "zákazy", + "backups": "snímky", + "status": "postavení", + "commands": "příkazy", + "ip_address": "ip adresa", + "port": "přístav", + "password_protected": "chráněný heslem", + "online": "server je online", + "offline": "server je offline", + "hostname": "název hostitele", + "welcome_message": "uvítací zpráva", + "join_password": "připojit heslo", + "create": "vytvořit", + "add": "přidat", + "start": "start", + "stop": "stop", + "reinstall": "přeinstalovat", + "reinstall_warning": "jste si jisti, že chcete přeinstalovat službu?", + "reset_warning": "Opravdu chcete obnovit nastavení služby?", + "reboot": "restart", + "reset_permissions": "vynulování oprávnění", + "update": "aktualizovat", + "restore": "obnovit", + "delete": "vymazat", + "token_id": "známka", + "description": "popis", + "name": "název", + "uid": "identifikátor", + "date": "datum", + "no": "ne", + "yes": "ano", + "service_management": "spravovat služby", + "logs": "protokoly", + "html_viewer": "html prohlížeč", + "viewer_description": "Zkopírujte a vložte tento kód HTML a zobrazte na své webové stránce prohlížeč 3 kanálů Teamspeak.", + "webpanel": "Správa webového panelu", + "service": "Servis", + "dconnect": "Přímé spojení", + "lconnect": "Spojte se s místním klientem", + "wconnect": "Spojte se s webovým klientem", + "management": "Řízení", + "webinterface": "Webové rozhraní" + }, + "danish": { + "general": "generelt", + "settings": "indstillinger", + "tokens": "tokens", + "bans": "forbud", + "backups": "backups", + "status": "status", + "commands": "kommandoer", + "ip_address": "ip-adresse", + "port": "port", + "password_protected": "beskyttet med adgangskode", + "online": "serveren er online", + "offline": "serveren er offline", + "hostname": "hostname", + "welcome_message": "velkommen besked", + "join_password": "slutte adgangskode", + "create": "skabe", + "add": "tilføje", + "start": "begyndelse", + "stop": "stoppe", + "reinstall": "geninstallere", + "reinstall_warning": "er du sikker på, du vil geninstallere din tjeneste?", + "reset_warning": "Er du sikker på, at du vil nulstille serviceindstillingerne?", + "reboot": "genstart", + "reset_permissions": "reset tilladelser", + "update": "opdatering", + "restore": "genoprette", + "delete": "slette", + "token_id": "polet", + "description": "beskrivelse", + "name": "navn", + "uid": "identifikator", + "date": "dato", + "no": "ingen", + "yes": "ja", + "service_management": "styre tjeneste", + "logs": "logs", + "html_viewer": "html viewer", + "viewer_description": "Kopier og indsæt denne HTML-kode for at få vist din teamspeak 3-kanalfremviser på din webside.", + "webpanel": "Webpanelstyring", + "service": "Service", + "dconnect": "Direkte forbindelse", + "lconnect": "Opret forbindelse med lokal klient", + "wconnect": "Opret forbindelse med Web Client", + "management": "Ledelse", + "webinterface": "webgrænseflade" + }, + "dutch": { + "general": "generelt", + "settings": "indstillinger", + "tokens": "tokens", + "bans": "forbud", + "backups": "backups", + "status": "status", + "commands": "kommandoer", + "ip_address": "ip-adresse", + "port": "port", + "password_protected": "beskyttet med adgangskode", + "online": "server is online", + "offline": "server is offline", + "hostname": "hostname", + "welcome_message": "velkommen besked", + "join_password": "slutte adgangskode", + "create": "skabe", + "add": "tilføje", + "start": "begyndelse", + "stop": "stoppe", + "reinstall": "geninstallere", + "reinstall_warning": "er du sikker på, du vil geninstallere din tjeneste?", + "reset_warning": "Weet u zeker dat u de service-instellingen wilt resetten?", + "reboot": "genstart", + "reset_permissions": "reset tilladelser", + "update": "opdatering", + "restore": "genoprette", + "delete": "slette", + "token_id": "polet", + "description": "beskrivelse", + "name": "navn", + "uid": "identifikator", + "date": "dato", + "no": "ingen", + "yes": "ja", + "service_management": "styre tjeneste", + "logs": "logs", + "html_viewer": "html viewer", + "viewer_description": "Kopieer en plak deze HTML-code om uw teamspeak 3-kanaals viewer op uw webpagina weer te geven.", + "webpanel": "Beheer van webpanelen", + "service": "Onderhoud", + "dconnect": "Directe verbinding", + "lconnect": "Maak contact met de lokale klant", + "wconnect": "Maak verbinding met Web Client", + "management": "Beheer", + "webinterface": "Webinterface" + }, + "farsi": { + "general": "general", + "settings": "settings", + "tokens": "tokens", + "bans": "bans", + "backups": "backups", + "status": "status", + "commands": "commands", + "ip_address": "ip address", + "port": "port", + "password_protected": "password protected", + "online": "online", + "offline": "offline", + "hostname": "hostname", + "welcome_message": "welcome message", + "join_password": "join password", + "create": "create", + "add": "add", + "start": "start", + "stop": "stop", + "reinstall": "reinstall", + "reinstall_warning": "Are you sure you want to reinstall the service?", + "reset_warning": "Are you sure you want to reset the service settings?", + "reboot": "restart", + "reset_permissions": "reset permissions", + "update": "update", + "restore": "restore", + "delete": "delete", + "token_id": "token", + "description": "description", + "name": "name", + "uid": "identifier", + "date": "date", + "no": "no", + "yes": "yes", + "service_management": "service management", + "logs": "logs", + "html_viewer": "html viewer", + "viewer_description": "Copy and paste this HTML code to display your teamspeak 3 channel viewer in your web page.", + "webpanel": "Web Panel Management", + "service": "Service", + "dconnect": "Direct Connect", + "lconnect": "Connect with Local Client", + "wconnect": "Connect with Web Client", + "management": "Management", + "webinterface": "Webinterface" + }, + "french": { + "general": "général", + "settings": "paramètres", + "tokens": "clés de privilege", + "bans": "bannissements", + "backups": "sauvegardes", + "status": "statut", + "commands": "commandes", + "ip_address": "adresse IP", + "port": "port", + "password_protected": "protégé par mot de passe", + "online": "le serveur est en ligne", + "offline": "le serveur est hors ligne", + "hostname": "nom du serveur", + "welcome_message": "message de bienvenue", + "join_password": "mot de passe", + "create": "créer", + "add": "ajouter", + "start": "démarrer", + "stop": "arrêter", + "reinstall": "réinstaller", + "reinstall_warning": "êtes-vous sûr de vouloir réinstaller ce serveur ?", + "reset_warning": "Voulez-vous vraiment réinitialiser les paramètres du service?", + "reboot": "redémarrage", + "reset_permissions": "réinitialiser les permissions", + "update": "mettre à jour", + "restore": "restaurer", + "delete": "effacer", + "token_id": "clé de privilege", + "description": "description", + "name": "nom", + "uid": "UID", + "date": "date", + "no": "non", + "yes": "oui", + "service_management": "gestion du service", + "logs": "journal", + "html_viewer": "API HTML", + "viewer_description": "Copiez et collez ce code HTML pour afficher votre visionneuse de canal TeamSpeak 3 dans votre page Web.", + "webpanel": "Gestion du panneau Web", + "service": "Un service", + "dconnect": "Connection directe", + "lconnect": "Connectez-vous avec le client local", + "wconnect": "Connectez-vous avec le client Web", + "management": "La gestion", + "webinterface": "Interface Web" + }, + + "german": { + "general": "Allgemein", + "settings": "Einstellungen", + "tokens": "Token", + "bans": "Ban", + "backups": "Backup", + "status": "Status", + "commands": "Optionen", + "ip_address": "IP-Adresse", + "port": "Port", + "password_protected": "Passwortschutz", + "online": " Server ist Online", + "offline": "Server ist Offline", + "hostname": "Hostname", + "welcome_message": "Willkommensnachricht", + "join_password": "Zugangspasswort", + "create": "Erstellen", + "add": "Hinzufügen", + "start": "Starten", + "stop": "Stoppen", + "reinstall": "Neu Installieren", + "reinstall_warning": "sind Sie sicher, dass Sie Ihren Teamspeak Server neu installieren möchten?", + "reset_warning": "Möchten Sie die Serviceeinstellungen wirklich zurücksetzen?", + "reboot": "Neustart", + "reset_permissions": "Berechtigungen zurücksetzen", + "update": "Speichern", + "restore": "Wiederherstellen", + "delete": "Löschen", + "token_id": "Token / Berechtigungsschlüssel", + "description": "Beschreibung", + "name": "Name", + "uid": "Eindeutige User-ID", + "date": "Datum", + "no": "Nein", + "yes": "Ja", + "service_management": "Service Verwalten", + "logs": "Logs", + "html_viewer": "HTML Viewer", + "viewer_description": "Kopieren Sie diesen HTML-Code und fügen Sie ihn ein, um Ihren Teamspeak 3-Kanal-Viewer auf Ihrer Webseite anzuzeigen.", + "webpanel": "Web Panel Management", + "service": "Service", + "dconnect": "Direkt Verbinden", + "lconnect": "Mit Lokalen Clienten Verbinden", + "wconnect": "Mit Web Clienten Verbinden", + "management": "Management", + "webinterface": "Webinterface" + + }, + "hungarian": { + "general": "Általános", + "settings": "Beállítások", + "tokens": "Admin Tokenek", + "bans": "Bannolások", + "backups": "Mentések", + "status": "Státusz", + "commands": "Parancsok", + "ip_address": "IP Cím", + "port": "Port", + "password_protected": "Jelszóval védve", + "online": "a szerver online", + "offline": "A szerver offline állapotban van", + "hostname": "Szerver Név", + "welcome_message": "Üdvözlő üzenet", + "join_password": "Szerver jelszó", + "create": "Létrehozás", + "add": "Hozzáadás", + "start": "Indítás", + "stop": "Leállítás", + "reinstall": "Újratelepítés", + "reinstall_warning": "Biztos újratelepíted a szervert? Minden adat el fog veszni!!", + "reset_warning": "Biztos lenullázod a zösszes jogosultságot? Minden jogosultság eltűnik!!", + "reboot": "Újraindítás", + "reset_permissions": "Jogosultságok nullázása", + "update": "Frissítés", + "restore": "Visszaállítás", + "delete": "Törlés", + "token_id": "Tokenek", + "description": "Megjegyzés", + "name": "Név", + "uid": "UID", + "date": "Dátum", + "no": "Nem", + "yes": "Igen", + "service_management": "Menedzsment", + "logs": "logok", + "html_viewer": "HTML kód weboldalba", + "viewer_description": "Másolja és illessze be ezt a HTML-kódot, hogy megjelenjen a teampeak 3-csatornás néző weboldalán.", + "webpanel": "Web panelkezelés", + "service": "Szolgáltatás", + "dconnect": "Közvetlen kapcsolat", + "lconnect": "Lépjen kapcsolatba a helyi klienssel", + "wconnect": "Lépjen kapcsolatba a Web klienssel", + "management": "vezetés", + "webinterface": "Webinterface" + }, + "latvian": { + "general": "general", + "settings": "settings", + "tokens": "tokens", + "bans": "bans", + "backups": "backups", + "status": "status", + "commands": "commands", + "ip_address": "ip address", + "port": "port", + "password_protected": "password protected", + "online": "online", + "offline": "offline", + "hostname": "hostname", + "welcome_message": "welcome message", + "join_password": "join password", + "create": "create", + "add": "add", + "start": "start", + "stop": "stop", + "reinstall": "reinstall", + "reinstall_warning": "Are you sure you want to reinstall the service?", + "reset_warning": "Are you sure you want to reset the service settings?", + "reboot": "restart", + "reset_permissions": "reset permissions", + "update": "update", + "restore": "restore", + "delete": "delete", + "token_id": "token", + "description": "description", + "name": "name", + "uid": "identifier", + "date": "date", + "no": "no", + "yes": "yes", + "service_management": "service management", + "logs": "logs", + "html_viewer": "html viewer", + "viewer_description": "Copy and paste this HTML code to display your teamspeak 3 channel viewer in your web page.", + "webpanel": "Web Panel Management", + "service": "Service", + "dconnect": "Direct Connect", + "lconnect": "Connect with Local Client", + "wconnect": "Connect with Web Client", + "management": "Management", + "webinterface": "Webinterface" + }, + "norwegian": { + "general": "generell", + "settings": "innstillinger", + "tokens": "tokens", + "bans": "forbud", + "backups": "sikkerhetskopier", + "status": "status", + "commands": "kommandoer", + "ip_address": "IP adresse", + "port": "port", + "password_protected": "passordbeskyttet", + "online": "serveren er online", + "offline": "serveren er offline", + "hostname": "vertsnavn", + "welcome_message": "velkomstmelding", + "join_password": "bli med passord", + "create": "skape", + "add": "Legg til", + "start": "start", + "stop": "Stoppe", + "reinstall": "ominstallering", + "reinstall_warning": "Er du sikker på at du vil installere tjenesten på nytt?", + "reset_warning": "Er du sikker på at du vil tilbakestille tjenesteinnstillingene?", + "reboot": "omstart", + "reset_permissions": "tilbakestille tillatelser", + "update": "Oppdater", + "restore": "restaurere", + "delete": "slette", + "token_id": "token", + "description": "beskrivelse", + "name": "Navn", + "uid": "identifikator", + "date": "Dato", + "no": "Nei", + "yes": "ja", + "service_management": "serviceledelse", + "logs": "tømmerstokker", + "html_viewer": "html-visning", + "viewer_description": "Kopier og lim inn denne HTML-koden for å vise teamspeak 3-kanalsvisningen på hjemmesiden din.", + "webpanel": "Ledelse av nettpaneler", + "service": "Service", + "dconnect": "Direkte tilkobling", + "lconnect": "Kontakt med lokal klient", + "wconnect": "Koble til webklienten", + "management": "Ledelse", + "webinterface": "webinterface" + }, + "portuguese-br": { + "general": "geral", + "settings": "definições", + "tokens": "tokens", + "bans": "bans", + "backups": "backups", + "status": "estado", + "commands": "comandos", + "ip_address": "endereço ip", + "port": "porta", + "password_protected": "senha", + "online": "online", + "offline": "offline", + "hostname": "hostname", + "welcome_message": "mensagem de boas vindas", + "join_password": "senha", + "create": "criar", + "add": "adicionar", + "start": "iniciar", + "stop": "parar", + "reinstall": "reinstalar", + "reinstall_warning": "Tem certeza de que deseja reinstalar o serviço?", + "reset_warning": "Are you sure you want to reset the service settings?", + "reboot": "reiniciar", + "reset_permissions": "reiniciar permissões", + "update": "atualizar", + "restore": "restaurar", + "delete": "excluir", + "token_id": "token", + "description": "descrição", + "name": "nome", + "uid": "identificador", + "date": "data", + "no": "não", + "yes": "sim", + "service_management": "gerenciamento de serviços", + "logs": "logs", + "html_viewer": "html viewer", + "viewer_description": "Copy and paste this HTML code to display your teamspeak 3 channel viewer in your web page.", + "webpanel": "Web Panel Management", + "service": "Service", + "dconnect": "Direct Connect", + "lconnect": "Connect with Local Client", + "wconnect": "Connect with Web Client", + "management": "Management", + "webinterface": "Webinterface" + }, + + + "portuguese-pt": { + "general": "Geral", + "settings": "Definições", + "tokens": "Chaves de Privilégio", + "bans": "Bans", + "backups": "Backups", + "status": "Estado", + "commands": "Comandos", + "ip_address": "Endreço de IP", + "port": "Porta", + "password_protected": "Protegido por Password", + "online": "O servidor está ligado", + "offline": "O servidor está desligado", + "hostname": "Hostname", + "welcome_message": "Mensagem de boas-vindas", + "join_password": "Password", + "create": "Criar", + "add": "Adicionar", + "start": "Iniciar", + "stop": "Parar", + "reinstall": "Reinstalar", + "reinstall_warning": "Realmente deseja reinstalar o serviço?", + "reset_warning": "Realmente deseja resetar as configurações de serviço?", + "reboot": "Reiniciar", + "reset_permissions": "Resetar Permissões", + "update": "Atualizar", + "restore": "Restaurar", + "delete": "Excluir", + "token_id": "ID da Chaves de Privilégio", + "description": "Descrição", + "name": "Nome", + "uid": "ID de Utilizador", + "date": "data", + "no": "Não", + "yes": "Sim", + "service_management": "Gerir Serviço", + "logs": "Logs", + "html_viewer": "Visão de HTML", + "viewer_description": "Copie este código HTML e cole ele para exibir o Tea*Speak Viewer no seu site.", + "webpanel": "Gerir o painel de Web", + "service": "Serviço", + "dconnect": "Ligação Directa", + "lconnect": "Ligar com o cliente local", + "wconnect": "Ligar com o cliente web", + "management": "Gerir", + "webinterface": "Interface Web" + }, + + "russian": { + "general": "Главная", + "settings": "Настройки", + "tokens": "Токены", + "bans": "Баны", + "backups": "Бекапы", + "status": "Статус", + "commands": "Команды", + "ip_address": "IP адрес", + "port": "Порт", + "password_protected": "Пароль на вход", + "online": "сервер онлайн", + "offline": "сервер не в сети", + "hostname": "Имя сервера", + "welcome_message": "Приветственное сообщение", + "join_password": "Пароль", + "create": "Создать", + "add": "Добавить", + "start": "Старт", + "stop": "Стоп", + "reinstall": "Переустановка", + "reinstall_warning": "Вы уверены, что хотите переустановить службу?", + "reset_warning": "Вы уверены, что хотите сбросить настройки сервиса?", + "reboot": "Перезагрузить", + "reset_permissions": "Сброс прав", + "update": "Обновить", + "restore": "Восстановить", + "delete": "Удалить", + "token_id": "Токен", + "description": "Описание", + "name": "Имя", + "uid": "uid", + "date": "Дата", + "no": "Нет", + "yes": "Да", + "service_management": "Управление сервером", + "logs": "Лог", + "html_viewer": "HTML Виджет", + "viewer_description": "Скопируйте и вставьте этот HTML-код, чтобы отобразить 3-канальный просмотрщик teampeak на веб-странице", + "webpanel": "Управление веб-панелью", + "service": "обслуживание", + "dconnect": "Прямое соединение", + "lconnect": "Связаться с локальным клиентом", + "wconnect": "Связаться с веб-клиентом", + "management": "управление", + "webinterface": "Веб интерфейс" + }, + "swedish": { + "general": "allmän", + "settings": "inställningar", + "tokens": "polletter", + "bans": "förbud", + "backups": "säkerhetskopior", + "status": "status", + "commands": "kommandon", + "ip_address": "IP-adress", + "port": "port", + "password_protected": "lösenord skyddat", + "online": "servern är online", + "offline": "servern är offline", + "hostname": "hostname", + "welcome_message": "välkomstmeddelande", + "join_password": "gå med lösenord", + "create": "skapa", + "add": "Lägg till", + "start": "start", + "stop": "sluta", + "reinstall": "ominstallation", + "reinstall_warning": "Är du säker på att du vill installera om tjänsten?", + "reset_warning": "Är du säker på att du vill återställa serviceinställningarna?", + "reboot": "omstart", + "reset_permissions": "återställa behörigheter", + "update": "uppdatering", + "restore": "Återställ", + "delete": "radera", + "token_id": "tecken", + "description": "beskrivning", + "name": "namn", + "uid": "identifierare", + "date": "datum", + "no": "Nej", + "yes": "ja", + "service_management": "servicehantering", + "logs": "loggar", + "html_viewer": "HTML-visare", + "viewer_description": "Kopiera och klistra in den här HTML-koden för att visa din teamspeak 3-kanalvisare på din webbsida.", + "webpanel": "Webbpanelhantering", + "service": "Service", + "dconnect": "Direktkoppling", + "lconnect": "Anslut till lokal klient", + "wconnect": "Anslut till webbklienten", + "management": "Förvaltning", + "webinterface": "Webbgränssnitt" + }, + "turkish": { + "general": "genel", + "settings": "ayarlar", + "tokens": "belirteçleri", + "bans": "yasakları", + "backups": "anlık", + "status": "durum", + "commands": "komutlar", + "ip_address": "ip adresi", + "port": "liman", + "password_protected": "parola korumalı", + "online": "sunucu çevrimiçi", + "offline": "sunucu çevrimdışı", + "hostname": "hostname", + "welcome_message": "karşılama mesajı", + "join_password": "parolanızı katılmak", + "create": "oluşturmak", + "add": "eklemek", + "start": "başlangıç", + "stop": "dur", + "reinstall": "yeniden", + "reinstall_warning": "Eğer hizmeti yeniden istediğinizden emin misiniz?", + "reset_warning": "Hizmet ayarlarını sıfırlamak istediğinizden emin misiniz?", + "reboot": "tekrar başlat", + "reset_permissions": "sıfırlama izinleri", + "update": "güncelleştirme", + "restore": "geri", + "delete": "silmek", + "token_id": "token", + "description": "tanım", + "name": "isim", + "uid": "tanımlayıcı", + "date": "tarih", + "no": "hayır", + "yes": "evet", + "service_management": "hizmet yönetimi", + "logs": "günlükleri", + "html_viewer": "html görüntüleyici", + "viewer_description": "Teamspeak 3 kanal görüntüleyicinizi web sayfanızda görüntülemek için bu HTML kodunu kopyalayıp yapıştırın.", + "webpanel": "Web Paneli Yönetimi", + "service": "Hizmet", + "dconnect": "Doğrudan bağlantı", + "lconnect": "Yerel İstemci ile bağlantı kurun", + "wconnect": "Web İstemcisi ile bağlanın", + "management": "yönetim", + "webinterface": "Webinterface" + }, + "ukranian": { + "general": "загальний", + "settings": "налаштування", + "tokens": "лексеми", + "bans": "заборони", + "backups": "резервні копії", + "status": "статус", + "commands": "команди", + "ip_address": "IP-адреса", + "port": "порт", + "password_protected": "захищений паролем", + "online": "сервер в мережі", + "offline": "сервер офлайн", + "hostname": "ім'я хоста", + "welcome_message": "вітальне повідомлення", + "join_password": "приєднатися до пароля", + "create": "творити", + "add": "додати", + "start": "почати", + "stop": "Стоп", + "reinstall": "перевстановити", + "reinstall_warning": "Ви впевнені, що хочете перевстановити послугу?", + "reset_warning": "Ви впевнені, що хочете скинути налаштування служби?", + "reboot": "перезапустити", + "reset_permissions": "скинути дозволи", + "update": "оновлення", + "restore": "відновлення", + "delete": "видалити", + "token_id": "лексема", + "description": "опис", + "name": "назва", + "uid": "ідентифікатор", + "date": "дата", + "no": "немає", + "yes": "так", + "service_management": "управління сервісом", + "logs": "колоди", + "html_viewer": "html переглядач", + "viewer_description": "Скопіюйте та вставте цей HTML-код, щоб відобразити програму 3-канального перегляду на своїй веб-сторінці.", + "webpanel": "Управління веб-панелями", + "service": "Сервіс", + "dconnect": "Пряме підключення", + "lconnect": "Підключіться до локального клієнта", + "wconnect": "Підключення до веб-клієнта", + "management": "Управління", + "webinterface": "Вебінтерфейс" + }, + "english": { + "general": "general", + "settings": "settings", + "tokens": "tokens", + "bans": "bans", + "backups": "backups", + "status": "status", + "commands": "commands", + "ip_address": "ip address", + "port": "port", + "password_protected": "password protected", + "online": "server is online", + "offline": "server is offline", + "hostname": "hostname", + "welcome_message": "welcome message", + "join_password": "join password", + "create": "create", + "add": "add", + "start": "start", + "stop": "stop", + "reinstall": "reinstall", + "reinstall_warning": "Are you sure you want to reinstall the service?", + "reset_warning": "Are you sure you want to reset the service settings?", + "reboot": "restart", + "reset_permissions": "reset permissions", + "update": "update", + "restore": "restore", + "delete": "delete", + "token_id": "token", + "description": "description", + "name": "name", + "uid": "identifier", + "date": "date", + "no": "no", + "yes": "yes", + "service_management": "service management", + "logs": "logs", + "html_viewer": "html viewer", + "viewer_description": "Copy and paste this HTML code to display your teamspeak 3 channel viewer in your web page.", + "webpanel": "Web Panel Management", + "service": "Service", + "dconnect": "Direct Connect", + "lconnect": "Connect with Local Client", + "wconnect": "Connect with Web Client", + "management": "Management", + "webinterface": "Webinterface" + }, + "spanish": { + "general": "general", + "settings": "configuración", + "tokens": "tokens", + "bans": "bloqueos", + "backups": "copias de seguridad", + "status": "estado", + "commands": "acciones", + "ip_address": "dirección ip", + "port": "puerto", + "password_protected": "protegido por contraseña", + "online": "el servidor está en línea", + "offline": "el servidor está fuera de línea", + "hostname": "nombre servidor", + "welcome_message": "mensaje de bienvenida", + "join_password": "Password de entrada", + "create": "crear", + "add": "añadir", + "start": "iniciar", + "stop": "detener", + "reinstall": "reinstalar", + "reinstall_warning": "Está seguro de que desea reinstalar el servicio?", + "reset_warning": "Está seguro que desea reiniciar los permisos del servicio?", + "reboot": "reiniciar", + "reset_permissions": "Reiniciar permisos", + "update": "actualizar", + "restore": "restaurar", + "delete": "borrar", + "token_id": "token", + "description": "descripción", + "name": "nombre", + "uid": "identificador", + "date": "fecha", + "no": "no", + "yes": "si", + "service_management": "Administración del servicio", + "logs": "registros", + "html_viewer": "Visor html", + "viewer_description": "Copia y pega este código html en tu página web para mostrar un visor de canales de teamspeak 3.", + "webpanel": "Administración del panel web", + "service": "Servicio", + "dconnect": "Conexión directa", + "lconnect": "Conéctese con el cliente local", + "wconnect": "Conéctese con el cliente web", + "management": "administración", + "webinterface": "Interfaz web" + }, + "italian": { + "general": "generale", + "settings": "impostazioni", + "tokens": "gettoni", + "bans": "divieti", + "backups": "backups", + "status": "stato", + "commands": "comandi", + "ip_address": "indirizzo IP", + "port": "port", + "password_protected": "protetto da password", + "online": "il server è online", + "offline": "il server non è in linea", + "hostname": "Nome host", + "welcome_message": "messaggio di benvenuto", + "join_password": "iscriviti alla password", + "create": "creare", + "add": "Inserisci", + "start": "inizio", + "stop": "fermare", + "reinstall": "reinstallazione", + "reinstall_warning": "Sei sicuro di voler reinstallare il servizio?", + "reset_warning": "Sei sicuro di voler ripristinare le impostazioni del servizio?", + "reboot": "ricomincia", + "reset_permissions": "ripristinare le autorizzazioni", + "update": "aggiornare", + "restore": "ristabilire", + "delete": "Elimina", + "token_id": "gettone", + "description": "descrizione", + "name": "nome", + "uid": "identificatore", + "date": "Data", + "no": "no", + "yes": "sì", + "service_management": "gestione del servizio", + "logs": "logs", + "html_viewer": "visualizzatore HTML", + "viewer_description": "Copia e incolla questo codice HTML per visualizzare il visualizzatore a 3 canali di teamspeak nella tua pagina web.", + "webpanel": "Gestione del pannello Web", + "service": "Servizio", + "dconnect": "Collegamento diretto", + "lconnect": "Connettiti con il client locale", + "wconnect": "Connettiti con Web Client", + "management": "Gestione", + "webinterface": "Interfaccia web" + } +} + diff --git a/TeaSpeak/servers/teamspeak/lib/Requests.php b/TeaSpeak/servers/teamspeak/lib/Requests.php new file mode 100644 index 0000000..bb26618 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests.php @@ -0,0 +1,980 @@ +dispatch('requests.before_request', array(&$url, &$headers, &$data, &$type, &$options)); + + if (!empty($options['transport'])) { + $transport = $options['transport']; + + if (is_string($options['transport'])) { + $transport = new $transport(); + } + } + else { + $need_ssl = (0 === stripos($url, 'https://')); + $capabilities = array('ssl' => $need_ssl); + $transport = self::get_transport($capabilities); + } + $response = $transport->request($url, $headers, $data, $options); + + $options['hooks']->dispatch('requests.before_parse', array(&$response, $url, $headers, $data, $type, $options)); + + return self::parse_response($response, $url, $headers, $data, $options); + } + + /** + * Send multiple HTTP requests simultaneously + * + * The `$requests` parameter takes an associative or indexed array of + * request fields. The key of each request can be used to match up the + * request with the returned data, or with the request passed into your + * `multiple.request.complete` callback. + * + * The request fields value is an associative array with the following keys: + * + * - `url`: Request URL Same as the `$url` parameter to + * {@see Requests::request} + * (string, required) + * - `headers`: Associative array of header fields. Same as the `$headers` + * parameter to {@see Requests::request} + * (array, default: `array()`) + * - `data`: Associative array of data fields or a string. Same as the + * `$data` parameter to {@see Requests::request} + * (array|string, default: `array()`) + * - `type`: HTTP request type (use Requests constants). Same as the `$type` + * parameter to {@see Requests::request} + * (string, default: `Requests::GET`) + * - `cookies`: Associative array of cookie name to value, or cookie jar. + * (array|Requests_Cookie_Jar) + * + * If the `$options` parameter is specified, individual requests will + * inherit options from it. This can be used to use a single hooking system, + * or set all the types to `Requests::POST`, for example. + * + * In addition, the `$options` parameter takes the following global options: + * + * - `complete`: A callback for when a request is complete. Takes two + * parameters, a Requests_Response/Requests_Exception reference, and the + * ID from the request array (Note: this can also be overridden on a + * per-request basis, although that's a little silly) + * (callback) + * + * @param array $requests Requests data (see description for more information) + * @param array $options Global and default options (see {@see Requests::request}) + * @return array Responses (either Requests_Response or a Requests_Exception object) + */ + public static function request_multiple($requests, $options = array()) { + $options = array_merge(self::get_default_options(true), $options); + + if (!empty($options['hooks'])) { + $options['hooks']->register('transport.internal.parse_response', array('Requests', 'parse_multiple')); + if (!empty($options['complete'])) { + $options['hooks']->register('multiple.request.complete', $options['complete']); + } + } + + foreach ($requests as $id => &$request) { + if (!isset($request['headers'])) { + $request['headers'] = array(); + } + if (!isset($request['data'])) { + $request['data'] = array(); + } + if (!isset($request['type'])) { + $request['type'] = self::GET; + } + if (!isset($request['options'])) { + $request['options'] = $options; + $request['options']['type'] = $request['type']; + } + else { + if (empty($request['options']['type'])) { + $request['options']['type'] = $request['type']; + } + $request['options'] = array_merge($options, $request['options']); + } + + self::set_defaults($request['url'], $request['headers'], $request['data'], $request['type'], $request['options']); + + // Ensure we only hook in once + if ($request['options']['hooks'] !== $options['hooks']) { + $request['options']['hooks']->register('transport.internal.parse_response', array('Requests', 'parse_multiple')); + if (!empty($request['options']['complete'])) { + $request['options']['hooks']->register('multiple.request.complete', $request['options']['complete']); + } + } + } + unset($request); + + if (!empty($options['transport'])) { + $transport = $options['transport']; + + if (is_string($options['transport'])) { + $transport = new $transport(); + } + } + else { + $transport = self::get_transport(); + } + $responses = $transport->request_multiple($requests, $options); + + foreach ($responses as $id => &$response) { + // If our hook got messed with somehow, ensure we end up with the + // correct response + if (is_string($response)) { + $request = $requests[$id]; + self::parse_multiple($response, $request); + $request['options']['hooks']->dispatch('multiple.request.complete', array(&$response, $id)); + } + } + + return $responses; + } + + /** + * Get the default options + * + * @see Requests::request() for values returned by this method + * @param boolean $multirequest Is this a multirequest? + * @return array Default option values + */ + protected static function get_default_options($multirequest = false) { + $defaults = array( + 'timeout' => 10, + 'connect_timeout' => 10, + 'useragent' => 'php-requests/' . self::VERSION, + 'protocol_version' => 1.1, + 'redirected' => 0, + 'redirects' => 10, + 'follow_redirects' => true, + 'blocking' => true, + 'type' => self::GET, + 'filename' => false, + 'auth' => false, + 'proxy' => false, + 'cookies' => false, + 'max_bytes' => false, + 'idn' => true, + 'hooks' => null, + 'transport' => null, + 'verify' => Requests::get_certificate_path(), + 'verifyname' => true, + ); + if ($multirequest !== false) { + $defaults['complete'] = null; + } + return $defaults; + } + + /** + * Get default certificate path. + * + * @return string Default certificate path. + */ + public static function get_certificate_path() { + if ( ! empty( Requests::$certificate_path ) ) { + return Requests::$certificate_path; + } + + return dirname(__FILE__) . '/Requests/Transport/cacert.pem'; + } + + /** + * Set default certificate path. + * + * @param string $path Certificate path, pointing to a PEM file. + */ + public static function set_certificate_path( $path ) { + Requests::$certificate_path = $path; + } + + /** + * Set the default values + * + * @param string $url URL to request + * @param array $headers Extra headers to send with the request + * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests + * @param string $type HTTP request type + * @param array $options Options for the request + * @return array $options + */ + protected static function set_defaults(&$url, &$headers, &$data, &$type, &$options) { + if (!preg_match('/^http(s)?:\/\//i', $url, $matches)) { + throw new Requests_Exception('Only HTTP(S) requests are handled.', 'nonhttp', $url); + } + + if (empty($options['hooks'])) { + $options['hooks'] = new Requests_Hooks(); + } + + if (is_array($options['auth'])) { + $options['auth'] = new Requests_Auth_Basic($options['auth']); + } + if ($options['auth'] !== false) { + $options['auth']->register($options['hooks']); + } + + if (is_string($options['proxy']) || is_array($options['proxy'])) { + $options['proxy'] = new Requests_Proxy_HTTP($options['proxy']); + } + if ($options['proxy'] !== false) { + $options['proxy']->register($options['hooks']); + } + + if (is_array($options['cookies'])) { + $options['cookies'] = new Requests_Cookie_Jar($options['cookies']); + } + elseif (empty($options['cookies'])) { + $options['cookies'] = new Requests_Cookie_Jar(); + } + if ($options['cookies'] !== false) { + $options['cookies']->register($options['hooks']); + } + + if ($options['idn'] !== false) { + $iri = new Requests_IRI($url); + $iri->host = Requests_IDNAEncoder::encode($iri->ihost); + $url = $iri->uri; + } + + // Massage the type to ensure we support it. + $type = strtoupper($type); + + if (!isset($options['data_format'])) { + if (in_array($type, array(self::HEAD, self::GET, self::DELETE))) { + $options['data_format'] = 'query'; + } + else { + $options['data_format'] = 'body'; + } + } + } + + /** + * HTTP response parser + * + * @throws Requests_Exception On missing head/body separator (`requests.no_crlf_separator`) + * @throws Requests_Exception On missing head/body separator (`noversion`) + * @throws Requests_Exception On missing head/body separator (`toomanyredirects`) + * + * @param string $headers Full response text including headers and body + * @param string $url Original request URL + * @param array $req_headers Original $headers array passed to {@link request()}, in case we need to follow redirects + * @param array $req_data Original $data array passed to {@link request()}, in case we need to follow redirects + * @param array $options Original $options array passed to {@link request()}, in case we need to follow redirects + * @return Requests_Response + */ + protected static function parse_response($headers, $url, $req_headers, $req_data, $options) { + $return = new Requests_Response(); + if (!$options['blocking']) { + return $return; + } + + $return->raw = $headers; + $return->url = $url; + + if (!$options['filename']) { + if (($pos = strpos($headers, "\r\n\r\n")) === false) { + // Crap! + throw new Requests_Exception('Missing header/body separator', 'requests.no_crlf_separator'); + } + + $headers = substr($return->raw, 0, $pos); + $return->body = substr($return->raw, $pos + strlen("\n\r\n\r")); + } + else { + $return->body = ''; + } + // Pretend CRLF = LF for compatibility (RFC 2616, section 19.3) + $headers = str_replace("\r\n", "\n", $headers); + // Unfold headers (replace [CRLF] 1*( SP | HT ) with SP) as per RFC 2616 (section 2.2) + $headers = preg_replace('/\n[ \t]/', ' ', $headers); + $headers = explode("\n", $headers); + preg_match('#^HTTP/(1\.\d)[ \t]+(\d+)#i', array_shift($headers), $matches); + if (empty($matches)) { + throw new Requests_Exception('Response could not be parsed', 'noversion', $headers); + } + $return->protocol_version = (float) $matches[1]; + $return->status_code = (int) $matches[2]; + if ($return->status_code >= 200 && $return->status_code < 300) { + $return->success = true; + } + + foreach ($headers as $header) { + list($key, $value) = explode(':', $header, 2); + $value = trim($value); + preg_replace('#(\s+)#i', ' ', $value); + $return->headers[$key] = $value; + } + if (isset($return->headers['transfer-encoding'])) { + $return->body = self::decode_chunked($return->body); + unset($return->headers['transfer-encoding']); + } + if (isset($return->headers['content-encoding'])) { + $return->body = self::decompress($return->body); + } + + //fsockopen and cURL compatibility + if (isset($return->headers['connection'])) { + unset($return->headers['connection']); + } + + $options['hooks']->dispatch('requests.before_redirect_check', array(&$return, $req_headers, $req_data, $options)); + + if ($return->is_redirect() && $options['follow_redirects'] === true) { + if (isset($return->headers['location']) && $options['redirected'] < $options['redirects']) { + if ($return->status_code === 303) { + $options['type'] = self::GET; + } + $options['redirected']++; + $location = $return->headers['location']; + if (strpos($location, 'http://') !== 0 && strpos($location, 'https://') !== 0) { + // relative redirect, for compatibility make it absolute + $location = Requests_IRI::absolutize($url, $location); + $location = $location->uri; + } + + $hook_args = array( + &$location, + &$req_headers, + &$req_data, + &$options, + $return + ); + $options['hooks']->dispatch('requests.before_redirect', $hook_args); + $redirected = self::request($location, $req_headers, $req_data, $options['type'], $options); + $redirected->history[] = $return; + return $redirected; + } + elseif ($options['redirected'] >= $options['redirects']) { + throw new Requests_Exception('Too many redirects', 'toomanyredirects', $return); + } + } + + $return->redirects = $options['redirected']; + + $options['hooks']->dispatch('requests.after_request', array(&$return, $req_headers, $req_data, $options)); + return $return; + } + + /** + * Callback for `transport.internal.parse_response` + * + * Internal use only. Converts a raw HTTP response to a Requests_Response + * while still executing a multiple request. + * + * @param string $response Full response text including headers and body (will be overwritten with Response instance) + * @param array $request Request data as passed into {@see Requests::request_multiple()} + * @return null `$response` is either set to a Requests_Response instance, or a Requests_Exception object + */ + public static function parse_multiple(&$response, $request) { + try { + $url = $request['url']; + $headers = $request['headers']; + $data = $request['data']; + $options = $request['options']; + $response = self::parse_response($response, $url, $headers, $data, $options); + } + catch (Requests_Exception $e) { + $response = $e; + } + } + + /** + * Decoded a chunked body as per RFC 2616 + * + * @see https://tools.ietf.org/html/rfc2616#section-3.6.1 + * @param string $data Chunked body + * @return string Decoded body + */ + protected static function decode_chunked($data) { + if (!preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', trim($data))) { + return $data; + } + + + + $decoded = ''; + $encoded = $data; + + while (true) { + $is_chunked = (bool) preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', $encoded, $matches); + if (!$is_chunked) { + // Looks like it's not chunked after all + return $data; + } + + $length = hexdec(trim($matches[1])); + if ($length === 0) { + // Ignore trailer headers + return $decoded; + } + + $chunk_length = strlen($matches[0]); + $decoded .= substr($encoded, $chunk_length, $length); + $encoded = substr($encoded, $chunk_length + $length + 2); + + if (trim($encoded) === '0' || empty($encoded)) { + return $decoded; + } + } + + // We'll never actually get down here + // @codeCoverageIgnoreStart + } + // @codeCoverageIgnoreEnd + + /** + * Convert a key => value array to a 'key: value' array for headers + * + * @param array $array Dictionary of header values + * @return array List of headers + */ + public static function flatten($array) { + $return = array(); + foreach ($array as $key => $value) { + $return[] = sprintf('%s: %s', $key, $value); + } + return $return; + } + + /** + * Convert a key => value array to a 'key: value' array for headers + * + * @codeCoverageIgnore + * @deprecated Misspelling of {@see Requests::flatten} + * @param array $array Dictionary of header values + * @return array List of headers + */ + public static function flattern($array) { + return self::flatten($array); + } + + /** + * Decompress an encoded body + * + * Implements gzip, compress and deflate. Guesses which it is by attempting + * to decode. + * + * @param string $data Compressed data in one of the above formats + * @return string Decompressed string + */ + public static function decompress($data) { + if (substr($data, 0, 2) !== "\x1f\x8b" && substr($data, 0, 2) !== "\x78\x9c") { + // Not actually compressed. Probably cURL ruining this for us. + return $data; + } + + if (function_exists('gzdecode') && ($decoded = @gzdecode($data)) !== false) { + return $decoded; + } + elseif (function_exists('gzinflate') && ($decoded = @gzinflate($data)) !== false) { + return $decoded; + } + elseif (($decoded = self::compatible_gzinflate($data)) !== false) { + return $decoded; + } + elseif (function_exists('gzuncompress') && ($decoded = @gzuncompress($data)) !== false) { + return $decoded; + } + + return $data; + } + + /** + * Decompression of deflated string while staying compatible with the majority of servers. + * + * Certain Servers will return deflated data with headers which PHP's gzinflate() + * function cannot handle out of the box. The following function has been created from + * various snippets on the gzinflate() PHP documentation. + * + * Warning: Magic numbers within. Due to the potential different formats that the compressed + * data may be returned in, some "magic offsets" are needed to ensure proper decompression + * takes place. For a simple progmatic way to determine the magic offset in use, see: + * https://core.trac.wordpress.org/ticket/18273 + * + * @since 2.8.1 + * @link https://core.trac.wordpress.org/ticket/18273 + * @link https://secure.php.net/manual/en/function.gzinflate.php#70875 + * @link https://secure.php.net/manual/en/function.gzinflate.php#77336 + * + * @param string $gzData String to decompress. + * @return string|bool False on failure. + */ + public static function compatible_gzinflate($gzData) { + // Compressed data might contain a full zlib header, if so strip it for + // gzinflate() + if (substr($gzData, 0, 3) == "\x1f\x8b\x08") { + $i = 10; + $flg = ord(substr($gzData, 3, 1)); + if ($flg > 0) { + if ($flg & 4) { + list($xlen) = unpack('v', substr($gzData, $i, 2)); + $i = $i + 2 + $xlen; + } + if ($flg & 8) { + $i = strpos($gzData, "\0", $i) + 1; + } + if ($flg & 16) { + $i = strpos($gzData, "\0", $i) + 1; + } + if ($flg & 2) { + $i = $i + 2; + } + } + $decompressed = self::compatible_gzinflate(substr($gzData, $i)); + if (false !== $decompressed) { + return $decompressed; + } + } + + // If the data is Huffman Encoded, we must first strip the leading 2 + // byte Huffman marker for gzinflate() + // The response is Huffman coded by many compressors such as + // java.util.zip.Deflater, Ruby’s Zlib::Deflate, and .NET's + // System.IO.Compression.DeflateStream. + // + // See https://decompres.blogspot.com/ for a quick explanation of this + // data type + $huffman_encoded = false; + + // low nibble of first byte should be 0x08 + list(, $first_nibble) = unpack('h', $gzData); + + // First 2 bytes should be divisible by 0x1F + list(, $first_two_bytes) = unpack('n', $gzData); + + if (0x08 == $first_nibble && 0 == ($first_two_bytes % 0x1F)) { + $huffman_encoded = true; + } + + if ($huffman_encoded) { + if (false !== ($decompressed = @gzinflate(substr($gzData, 2)))) { + return $decompressed; + } + } + + if ("\x50\x4b\x03\x04" == substr($gzData, 0, 4)) { + // ZIP file format header + // Offset 6: 2 bytes, General-purpose field + // Offset 26: 2 bytes, filename length + // Offset 28: 2 bytes, optional field length + // Offset 30: Filename field, followed by optional field, followed + // immediately by data + list(, $general_purpose_flag) = unpack('v', substr($gzData, 6, 2)); + + // If the file has been compressed on the fly, 0x08 bit is set of + // the general purpose field. We can use this to differentiate + // between a compressed document, and a ZIP file + $zip_compressed_on_the_fly = (0x08 == (0x08 & $general_purpose_flag)); + + if (!$zip_compressed_on_the_fly) { + // Don't attempt to decode a compressed zip file + return $gzData; + } + + // Determine the first byte of data, based on the above ZIP header + // offsets: + $first_file_start = array_sum(unpack('v2', substr($gzData, 26, 4))); + if (false !== ($decompressed = @gzinflate(substr($gzData, 30 + $first_file_start)))) { + return $decompressed; + } + return false; + } + + // Finally fall back to straight gzinflate + if (false !== ($decompressed = @gzinflate($gzData))) { + return $decompressed; + } + + // Fallback for all above failing, not expected, but included for + // debugging and preventing regressions and to track stats + if (false !== ($decompressed = @gzinflate(substr($gzData, 2)))) { + return $decompressed; + } + + return false; + } + + public static function match_domain($host, $reference) { + // Check for a direct match + if ($host === $reference) { + return true; + } + + // Calculate the valid wildcard match if the host is not an IP address + // Also validates that the host has 3 parts or more, as per Firefox's + // ruleset. + $parts = explode('.', $host); + if (ip2long($host) === false && count($parts) >= 3) { + $parts[0] = '*'; + $wildcard = implode('.', $parts); + if ($wildcard === $reference) { + return true; + } + } + + return false; + } +} diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Auth.php b/TeaSpeak/servers/teamspeak/lib/Requests/Auth.php new file mode 100644 index 0000000..bca4109 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Auth.php @@ -0,0 +1,33 @@ +user, $this->pass) = $args; + } + } + + /** + * Register the necessary callbacks + * + * @see curl_before_send + * @see fsockopen_header + * @param Requests_Hooks $hooks Hook system + */ + public function register(Requests_Hooks &$hooks) { + $hooks->register('curl.before_send', array(&$this, 'curl_before_send')); + $hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header')); + } + + /** + * Set cURL parameters before the data is sent + * + * @param resource $handle cURL resource + */ + public function curl_before_send(&$handle) { + curl_setopt($handle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + curl_setopt($handle, CURLOPT_USERPWD, $this->getAuthString()); + } + + /** + * Add extra headers to the request before sending + * + * @param string $out HTTP header string + */ + public function fsockopen_header(&$out) { + $out .= sprintf("Authorization: Basic %s\r\n", base64_encode($this->getAuthString())); + } + + /** + * Get the authentication string (user:pass) + * + * @return string + */ + public function getAuthString() { + return $this->user . ':' . $this->pass; + } +} \ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Cookie.php b/TeaSpeak/servers/teamspeak/lib/Requests/Cookie.php new file mode 100644 index 0000000..00fbbc7 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Cookie.php @@ -0,0 +1,500 @@ +name = $name; + $this->value = $value; + $this->attributes = $attributes; + $default_flags = array( + 'creation' => time(), + 'last-access' => time(), + 'persistent' => false, + 'host-only' => true, + ); + $this->flags = array_merge($default_flags, $flags); + + $this->reference_time = time(); + if ($reference_time !== null) { + $this->reference_time = $reference_time; + } + + $this->normalize(); + } + + /** + * Check if a cookie is expired. + * + * Checks the age against $this->reference_time to determine if the cookie + * is expired. + * + * @return boolean True if expired, false if time is valid. + */ + public function is_expired() { + // RFC6265, s. 4.1.2.2: + // If a cookie has both the Max-Age and the Expires attribute, the Max- + // Age attribute has precedence and controls the expiration date of the + // cookie. + if (isset($this->attributes['max-age'])) { + $max_age = $this->attributes['max-age']; + return $max_age < $this->reference_time; + } + + if (isset($this->attributes['expires'])) { + $expires = $this->attributes['expires']; + return $expires < $this->reference_time; + } + + return false; + } + + /** + * Check if a cookie is valid for a given URI + * + * @param Requests_IRI $uri URI to check + * @return boolean Whether the cookie is valid for the given URI + */ + public function uri_matches(Requests_IRI $uri) { + if (!$this->domain_matches($uri->host)) { + return false; + } + + if (!$this->path_matches($uri->path)) { + return false; + } + + return empty($this->attributes['secure']) || $uri->scheme === 'https'; + } + + /** + * Check if a cookie is valid for a given domain + * + * @param string $string Domain to check + * @return boolean Whether the cookie is valid for the given domain + */ + public function domain_matches($string) { + if (!isset($this->attributes['domain'])) { + // Cookies created manually; cookies created by Requests will set + // the domain to the requested domain + return true; + } + + $domain_string = $this->attributes['domain']; + if ($domain_string === $string) { + // The domain string and the string are identical. + return true; + } + + // If the cookie is marked as host-only and we don't have an exact + // match, reject the cookie + if ($this->flags['host-only'] === true) { + return false; + } + + if (strlen($string) <= strlen($domain_string)) { + // For obvious reasons, the string cannot be a suffix if the domain + // is shorter than the domain string + return false; + } + + if (substr($string, -1 * strlen($domain_string)) !== $domain_string) { + // The domain string should be a suffix of the string. + return false; + } + + $prefix = substr($string, 0, strlen($string) - strlen($domain_string)); + if (substr($prefix, -1) !== '.') { + // The last character of the string that is not included in the + // domain string should be a %x2E (".") character. + return false; + } + + // The string should be a host name (i.e., not an IP address). + return !preg_match('#^(.+\.)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$#', $string); + } + + /** + * Check if a cookie is valid for a given path + * + * From the path-match check in RFC 6265 section 5.1.4 + * + * @param string $request_path Path to check + * @return boolean Whether the cookie is valid for the given path + */ + public function path_matches($request_path) { + if (empty($request_path)) { + // Normalize empty path to root + $request_path = '/'; + } + + if (!isset($this->attributes['path'])) { + // Cookies created manually; cookies created by Requests will set + // the path to the requested path + return true; + } + + $cookie_path = $this->attributes['path']; + + if ($cookie_path === $request_path) { + // The cookie-path and the request-path are identical. + return true; + } + + if (strlen($request_path) > strlen($cookie_path) && substr($request_path, 0, strlen($cookie_path)) === $cookie_path) { + if (substr($cookie_path, -1) === '/') { + // The cookie-path is a prefix of the request-path, and the last + // character of the cookie-path is %x2F ("/"). + return true; + } + + if (substr($request_path, strlen($cookie_path), 1) === '/') { + // The cookie-path is a prefix of the request-path, and the + // first character of the request-path that is not included in + // the cookie-path is a %x2F ("/") character. + return true; + } + } + + return false; + } + + /** + * Normalize cookie and attributes + * + * @return boolean Whether the cookie was successfully normalized + */ + public function normalize() { + foreach ($this->attributes as $key => $value) { + $orig_value = $value; + $value = $this->normalize_attribute($key, $value); + if ($value === null) { + unset($this->attributes[$key]); + continue; + } + + if ($value !== $orig_value) { + $this->attributes[$key] = $value; + } + } + + return true; + } + + /** + * Parse an individual cookie attribute + * + * Handles parsing individual attributes from the cookie values. + * + * @param string $name Attribute name + * @param string|boolean $value Attribute value (string value, or true if empty/flag) + * @return mixed Value if available, or null if the attribute value is invalid (and should be skipped) + */ + protected function normalize_attribute($name, $value) { + switch (strtolower($name)) { + case 'expires': + // Expiration parsing, as per RFC 6265 section 5.2.1 + if (is_int($value)) { + return $value; + } + + $expiry_time = strtotime($value); + if ($expiry_time === false) { + return null; + } + + return $expiry_time; + + case 'max-age': + // Expiration parsing, as per RFC 6265 section 5.2.2 + if (is_int($value)) { + return $value; + } + + // Check that we have a valid age + if (!preg_match('/^-?\d+$/', $value)) { + return null; + } + + $delta_seconds = (int) $value; + if ($delta_seconds <= 0) { + $expiry_time = 0; + } + else { + $expiry_time = $this->reference_time + $delta_seconds; + } + + return $expiry_time; + + case 'domain': + // Domain normalization, as per RFC 6265 section 5.2.3 + if ($value[0] === '.') { + $value = substr($value, 1); + } + + return $value; + + default: + return $value; + } + } + + /** + * Format a cookie for a Cookie header + * + * This is used when sending cookies to a server. + * + * @return string Cookie formatted for Cookie header + */ + public function format_for_header() { + return sprintf('%s=%s', $this->name, $this->value); + } + + /** + * Format a cookie for a Cookie header + * + * @codeCoverageIgnore + * @deprecated Use {@see Requests_Cookie::format_for_header} + * @return string + */ + public function formatForHeader() { + return $this->format_for_header(); + } + + /** + * Format a cookie for a Set-Cookie header + * + * This is used when sending cookies to clients. This isn't really + * applicable to client-side usage, but might be handy for debugging. + * + * @return string Cookie formatted for Set-Cookie header + */ + public function format_for_set_cookie() { + $header_value = $this->format_for_header(); + if (!empty($this->attributes)) { + $parts = array(); + foreach ($this->attributes as $key => $value) { + // Ignore non-associative attributes + if (is_numeric($key)) { + $parts[] = $value; + } + else { + $parts[] = sprintf('%s=%s', $key, $value); + } + } + + $header_value .= '; ' . implode('; ', $parts); + } + return $header_value; + } + + /** + * Format a cookie for a Set-Cookie header + * + * @codeCoverageIgnore + * @deprecated Use {@see Requests_Cookie::format_for_set_cookie} + * @return string + */ + public function formatForSetCookie() { + return $this->format_for_set_cookie(); + } + + /** + * Get the cookie value + * + * Attributes and other data can be accessed via methods. + */ + public function __toString() { + return $this->value; + } + + /** + * Parse a cookie string into a cookie object + * + * Based on Mozilla's parsing code in Firefox and related projects, which + * is an intentional deviation from RFC 2109 and RFC 2616. RFC 6265 + * specifies some of this handling, but not in a thorough manner. + * + * @param string Cookie header value (from a Set-Cookie header) + * @return Requests_Cookie Parsed cookie object + */ + public static function parse($string, $name = '', $reference_time = null) { + $parts = explode(';', $string); + $kvparts = array_shift($parts); + + if (!empty($name)) { + $value = $string; + } + elseif (strpos($kvparts, '=') === false) { + // Some sites might only have a value without the equals separator. + // Deviate from RFC 6265 and pretend it was actually a blank name + // (`=foo`) + // + // https://bugzilla.mozilla.org/show_bug.cgi?id=169091 + $name = ''; + $value = $kvparts; + } + else { + list($name, $value) = explode('=', $kvparts, 2); + } + $name = trim($name); + $value = trim($value); + + // Attribute key are handled case-insensitively + $attributes = new Requests_Utility_CaseInsensitiveDictionary(); + + if (!empty($parts)) { + foreach ($parts as $part) { + if (strpos($part, '=') === false) { + $part_key = $part; + $part_value = true; + } + else { + list($part_key, $part_value) = explode('=', $part, 2); + $part_value = trim($part_value); + } + + $part_key = trim($part_key); + $attributes[$part_key] = $part_value; + } + } + + return new Requests_Cookie($name, $value, $attributes, array(), $reference_time); + } + + /** + * Parse all Set-Cookie headers from request headers + * + * @param Requests_Response_Headers $headers Headers to parse from + * @param Requests_IRI|null $origin URI for comparing cookie origins + * @param int|null $time Reference time for expiration calculation + * @return array + */ + public static function parse_from_headers(Requests_Response_Headers $headers, Requests_IRI $origin = null, $time = null) { + $cookie_headers = $headers->getValues('Set-Cookie'); + if (empty($cookie_headers)) { + return array(); + } + + $cookies = array(); + foreach ($cookie_headers as $header) { + $parsed = self::parse($header, '', $time); + + // Default domain/path attributes + if (empty($parsed->attributes['domain']) && !empty($origin)) { + $parsed->attributes['domain'] = $origin->host; + $parsed->flags['host-only'] = true; + } + else { + $parsed->flags['host-only'] = false; + } + + $path_is_valid = (!empty($parsed->attributes['path']) && $parsed->attributes['path'][0] === '/'); + if (!$path_is_valid && !empty($origin)) { + $path = $origin->path; + + // Default path normalization as per RFC 6265 section 5.1.4 + if (substr($path, 0, 1) !== '/') { + // If the uri-path is empty or if the first character of + // the uri-path is not a %x2F ("/") character, output + // %x2F ("/") and skip the remaining steps. + $path = '/'; + } + elseif (substr_count($path, '/') === 1) { + // If the uri-path contains no more than one %x2F ("/") + // character, output %x2F ("/") and skip the remaining + // step. + $path = '/'; + } + else { + // Output the characters of the uri-path from the first + // character up to, but not including, the right-most + // %x2F ("/"). + $path = substr($path, 0, strrpos($path, '/')); + } + $parsed->attributes['path'] = $path; + } + + // Reject invalid cookie domains + if (!empty($origin) && !$parsed->domain_matches($origin->host)) { + continue; + } + + $cookies[$parsed->name] = $parsed; + } + + return $cookies; + } + + /** + * Parse all Set-Cookie headers from request headers + * + * @codeCoverageIgnore + * @deprecated Use {@see Requests_Cookie::parse_from_headers} + * @return string + */ + public static function parseFromHeaders(Requests_Response_Headers $headers) { + return self::parse_from_headers($headers); + } +} diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Cookie/Jar.php b/TeaSpeak/servers/teamspeak/lib/Requests/Cookie/Jar.php new file mode 100644 index 0000000..69be0fb --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Cookie/Jar.php @@ -0,0 +1,175 @@ +cookies = $cookies; + } + + /** + * Normalise cookie data into a Requests_Cookie + * + * @param string|Requests_Cookie $cookie + * @return Requests_Cookie + */ + public function normalize_cookie($cookie, $key = null) { + if ($cookie instanceof Requests_Cookie) { + return $cookie; + } + + return Requests_Cookie::parse($cookie, $key); + } + + /** + * Normalise cookie data into a Requests_Cookie + * + * @codeCoverageIgnore + * @deprecated Use {@see Requests_Cookie_Jar::normalize_cookie} + * @return Requests_Cookie + */ + public function normalizeCookie($cookie, $key = null) { + return $this->normalize_cookie($cookie, $key); + } + + /** + * Check if the given item exists + * + * @param string $key Item key + * @return boolean Does the item exist? + */ + public function offsetExists($key) { + return isset($this->cookies[$key]); + } + + /** + * Get the value for the item + * + * @param string $key Item key + * @return string Item value + */ + public function offsetGet($key) { + if (!isset($this->cookies[$key])) { + return null; + } + + return $this->cookies[$key]; + } + + /** + * Set the given item + * + * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`) + * + * @param string $key Item name + * @param string $value Item value + */ + public function offsetSet($key, $value) { + if ($key === null) { + throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset'); + } + + $this->cookies[$key] = $value; + } + + /** + * Unset the given header + * + * @param string $key + */ + public function offsetUnset($key) { + unset($this->cookies[$key]); + } + + /** + * Get an iterator for the data + * + * @return ArrayIterator + */ + public function getIterator() { + return new ArrayIterator($this->cookies); + } + + /** + * Register the cookie handler with the request's hooking system + * + * @param Requests_Hooker $hooks Hooking system + */ + public function register(Requests_Hooker $hooks) { + $hooks->register('requests.before_request', array($this, 'before_request')); + $hooks->register('requests.before_redirect_check', array($this, 'before_redirect_check')); + } + + /** + * Add Cookie header to a request if we have any + * + * As per RFC 6265, cookies are separated by '; ' + * + * @param string $url + * @param array $headers + * @param array $data + * @param string $type + * @param array $options + */ + public function before_request($url, &$headers, &$data, &$type, &$options) { + if (!$url instanceof Requests_IRI) { + $url = new Requests_IRI($url); + } + + if (!empty($this->cookies)) { + $cookies = array(); + foreach ($this->cookies as $key => $cookie) { + $cookie = $this->normalize_cookie($cookie, $key); + + // Skip expired cookies + if ($cookie->is_expired()) { + continue; + } + + if ($cookie->domain_matches($url->host)) { + $cookies[] = $cookie->format_for_header(); + } + } + + $headers['Cookie'] = implode('; ', $cookies); + } + } + + /** + * Parse all cookies from a response and attach them to the response + * + * @var Requests_Response $response + */ + public function before_redirect_check(Requests_Response &$return) { + $url = $return->url; + if (!$url instanceof Requests_IRI) { + $url = new Requests_IRI($url); + } + + $cookies = Requests_Cookie::parse_from_headers($return->headers, $url); + $this->cookies = array_merge($this->cookies, $cookies); + $return->cookies = $this; + } +} \ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Exception.php b/TeaSpeak/servers/teamspeak/lib/Requests/Exception.php new file mode 100644 index 0000000..37d4711 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Exception.php @@ -0,0 +1,62 @@ +type = $type; + $this->data = $data; + } + + /** + * Like {@see getCode()}, but a string code. + * + * @codeCoverageIgnore + * @return string + */ + public function getType() { + return $this->type; + } + + /** + * Gives any relevant data + * + * @codeCoverageIgnore + * @return mixed + */ + public function getData() { + return $this->data; + } +} \ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP.php b/TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP.php new file mode 100644 index 0000000..9ac6a87 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP.php @@ -0,0 +1,71 @@ +reason = $reason; + } + + $message = sprintf('%d %s', $this->code, $this->reason); + parent::__construct($message, 'httpresponse', $data, $this->code); + } + + /** + * Get the status message + */ + public function getReason() { + return $this->reason; + } + + /** + * Get the correct exception class for a given error code + * + * @param int|bool $code HTTP status code, or false if unavailable + * @return string Exception class name to use + */ + public static function get_class($code) { + if (!$code) { + return 'Requests_Exception_HTTP_Unknown'; + } + + $class = sprintf('Requests_Exception_HTTP_%d', $code); + if (class_exists($class)) { + return $class; + } + + return 'Requests_Exception_HTTP_Unknown'; + } +} \ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/304.php b/TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/304.php new file mode 100644 index 0000000..6799033 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Exception/HTTP/304.php @@ -0,0 +1,27 @@ +code = $data->status_code; + } + + parent::__construct($reason, $data); + } +} \ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Exception/Transport.php b/TeaSpeak/servers/teamspeak/lib/Requests/Exception/Transport.php new file mode 100644 index 0000000..e60b488 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Exception/Transport.php @@ -0,0 +1,5 @@ +type = $type; + } + + if ($code !== null) { + $this->code = $code; + } + + if ($message !== null) { + $this->reason = $message; + } + + $message = sprintf('%d %s', $this->code, $this->reason); + parent::__construct($message, $this->type, $data, $this->code); + } + + /** + * Get the error message + */ + public function getReason() { + return $this->reason; + } + +} diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Hooker.php b/TeaSpeak/servers/teamspeak/lib/Requests/Hooker.php new file mode 100644 index 0000000..f667ae9 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Hooker.php @@ -0,0 +1,33 @@ +0 is executed later + */ + public function register($hook, $callback, $priority = 0); + + /** + * Dispatch a message + * + * @param string $hook Hook name + * @param array $parameters Parameters to pass to callbacks + * @return boolean Successfulness + */ + public function dispatch($hook, $parameters = array()); +} \ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Hooks.php b/TeaSpeak/servers/teamspeak/lib/Requests/Hooks.php new file mode 100644 index 0000000..2e61c73 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Hooks.php @@ -0,0 +1,68 @@ +0 is executed later + */ + public function register($hook, $callback, $priority = 0) { + if (!isset($this->hooks[$hook])) { + $this->hooks[$hook] = array(); + } + if (!isset($this->hooks[$hook][$priority])) { + $this->hooks[$hook][$priority] = array(); + } + + $this->hooks[$hook][$priority][] = $callback; + } + + /** + * Dispatch a message + * + * @param string $hook Hook name + * @param array $parameters Parameters to pass to callbacks + * @return boolean Successfulness + */ + public function dispatch($hook, $parameters = array()) { + if (empty($this->hooks[$hook])) { + return false; + } + + foreach ($this->hooks[$hook] as $priority => $hooked) { + foreach ($hooked as $callback) { + call_user_func_array($callback, $parameters); + } + } + + return true; + } +} \ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/IDNAEncoder.php b/TeaSpeak/servers/teamspeak/lib/Requests/IDNAEncoder.php new file mode 100644 index 0000000..ebbe211 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/IDNAEncoder.php @@ -0,0 +1,388 @@ + 0) { + if ($position + $length > $strlen) { + throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); + } + for ($position++; $remaining > 0; $position++) { + $value = ord($input[$position]); + + // If it is invalid, count the sequence as invalid and reprocess the current byte: + if (($value & 0xC0) !== 0x80) { + throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); + } + + $character |= ($value & 0x3F) << (--$remaining * 6); + } + $position--; + } + + if ( + // Non-shortest form sequences are invalid + $length > 1 && $character <= 0x7F + || $length > 2 && $character <= 0x7FF + || $length > 3 && $character <= 0xFFFF + // Outside of range of ucschar codepoints + // Noncharacters + || ($character & 0xFFFE) === 0xFFFE + || $character >= 0xFDD0 && $character <= 0xFDEF + || ( + // Everything else not in ucschar + $character > 0xD7FF && $character < 0xF900 + || $character < 0x20 + || $character > 0x7E && $character < 0xA0 + || $character > 0xEFFFD + ) + ) { + throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); + } + + $codepoints[] = $character; + } + + return $codepoints; + } + + /** + * RFC3492-compliant encoder + * + * @internal Pseudo-code from Section 6.3 is commented with "#" next to relevant code + * @throws Requests_Exception On character outside of the domain (never happens with Punycode) (`idna.character_outside_domain`) + * + * @param string $input UTF-8 encoded string to encode + * @return string Punycode-encoded string + */ + public static function punycode_encode($input) { + $output = ''; +# let n = initial_n + $n = self::BOOTSTRAP_INITIAL_N; +# let delta = 0 + $delta = 0; +# let bias = initial_bias + $bias = self::BOOTSTRAP_INITIAL_BIAS; +# let h = b = the number of basic code points in the input + $h = $b = 0; // see loop +# copy them to the output in order + $codepoints = self::utf8_to_codepoints($input); + $extended = array(); + + foreach ($codepoints as $char) { + if ($char < 128) { + // Character is valid ASCII + // TODO: this should also check if it's valid for a URL + $output .= chr($char); + $h++; + } + // Check if the character is non-ASCII, but below initial n + // This never occurs for Punycode, so ignore in coverage + // @codeCoverageIgnoreStart + elseif ($char < $n) { + throw new Requests_Exception('Invalid character', 'idna.character_outside_domain', $char); + } + // @codeCoverageIgnoreEnd + else { + $extended[$char] = true; + } + } + $extended = array_keys($extended); + sort($extended); + $b = $h; +# [copy them] followed by a delimiter if b > 0 + if (strlen($output) > 0) { + $output .= '-'; + } +# {if the input contains a non-basic code point < n then fail} +# while h < length(input) do begin + while ($h < count($codepoints)) { +# let m = the minimum code point >= n in the input + $m = array_shift($extended); + //printf('next code point to insert is %s' . PHP_EOL, dechex($m)); +# let delta = delta + (m - n) * (h + 1), fail on overflow + $delta += ($m - $n) * ($h + 1); +# let n = m + $n = $m; +# for each code point c in the input (in order) do begin + for ($num = 0; $num < count($codepoints); $num++) { + $c = $codepoints[$num]; +# if c < n then increment delta, fail on overflow + if ($c < $n) { + $delta++; + } +# if c == n then begin + elseif ($c === $n) { +# let q = delta + $q = $delta; +# for k = base to infinity in steps of base do begin + for ($k = self::BOOTSTRAP_BASE; ; $k += self::BOOTSTRAP_BASE) { +# let t = tmin if k <= bias {+ tmin}, or +# tmax if k >= bias + tmax, or k - bias otherwise + if ($k <= ($bias + self::BOOTSTRAP_TMIN)) { + $t = self::BOOTSTRAP_TMIN; + } + elseif ($k >= ($bias + self::BOOTSTRAP_TMAX)) { + $t = self::BOOTSTRAP_TMAX; + } + else { + $t = $k - $bias; + } +# if q < t then break + if ($q < $t) { + break; + } +# output the code point for digit t + ((q - t) mod (base - t)) + $digit = $t + (($q - $t) % (self::BOOTSTRAP_BASE - $t)); + $output .= self::digit_to_char($digit); +# let q = (q - t) div (base - t) + $q = floor(($q - $t) / (self::BOOTSTRAP_BASE - $t)); +# end + } +# output the code point for digit q + $output .= self::digit_to_char($q); +# let bias = adapt(delta, h + 1, test h equals b?) + $bias = self::adapt($delta, $h + 1, $h === $b); +# let delta = 0 + $delta = 0; +# increment h + $h++; +# end + } +# end + } +# increment delta and n + $delta++; + $n++; +# end + } + + return $output; + } + + /** + * Convert a digit to its respective character + * + * @see https://tools.ietf.org/html/rfc3492#section-5 + * @throws Requests_Exception On invalid digit (`idna.invalid_digit`) + * + * @param int $digit Digit in the range 0-35 + * @return string Single character corresponding to digit + */ + protected static function digit_to_char($digit) { + // @codeCoverageIgnoreStart + // As far as I know, this never happens, but still good to be sure. + if ($digit < 0 || $digit > 35) { + throw new Requests_Exception(sprintf('Invalid digit %d', $digit), 'idna.invalid_digit', $digit); + } + // @codeCoverageIgnoreEnd + $digits = 'abcdefghijklmnopqrstuvwxyz0123456789'; + return substr($digits, $digit, 1); + } + + /** + * Adapt the bias + * + * @see https://tools.ietf.org/html/rfc3492#section-6.1 + * @param int $delta + * @param int $numpoints + * @param bool $firsttime + * @return int New bias + */ + protected static function adapt($delta, $numpoints, $firsttime) { +# function adapt(delta,numpoints,firsttime): +# if firsttime then let delta = delta div damp + if ($firsttime) { + $delta = floor($delta / self::BOOTSTRAP_DAMP); + } +# else let delta = delta div 2 + else { + $delta = floor($delta / 2); + } +# let delta = delta + (delta div numpoints) + $delta += floor($delta / $numpoints); +# let k = 0 + $k = 0; +# while delta > ((base - tmin) * tmax) div 2 do begin + $max = floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN) * self::BOOTSTRAP_TMAX) / 2); + while ($delta > $max) { +# let delta = delta div (base - tmin) + $delta = floor($delta / (self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN)); +# let k = k + base + $k += self::BOOTSTRAP_BASE; +# end + } +# return k + (((base - tmin + 1) * delta) div (delta + skew)) + return $k + floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN + 1) * $delta) / ($delta + self::BOOTSTRAP_SKEW)); + } +} \ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/IPv6.php b/TeaSpeak/servers/teamspeak/lib/Requests/IPv6.php new file mode 100644 index 0000000..204dbd7 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/IPv6.php @@ -0,0 +1,190 @@ + FF01:0:0:0:0:0:0:101 + * ::1 -> 0:0:0:0:0:0:0:1 + * + * @author Alexander Merz + * @author elfrink at introweb dot nl + * @author Josh Peck + * @copyright 2003-2005 The PHP Group + * @license http://www.opensource.org/licenses/bsd-license.php + * @param string $ip An IPv6 address + * @return string The uncompressed IPv6 address + */ + public static function uncompress($ip) { + if (substr_count($ip, '::') !== 1) { + return $ip; + } + + list($ip1, $ip2) = explode('::', $ip); + $c1 = ($ip1 === '') ? -1 : substr_count($ip1, ':'); + $c2 = ($ip2 === '') ? -1 : substr_count($ip2, ':'); + + if (strpos($ip2, '.') !== false) { + $c2++; + } + // :: + if ($c1 === -1 && $c2 === -1) { + $ip = '0:0:0:0:0:0:0:0'; + } + // ::xxx + else if ($c1 === -1) { + $fill = str_repeat('0:', 7 - $c2); + $ip = str_replace('::', $fill, $ip); + } + // xxx:: + else if ($c2 === -1) { + $fill = str_repeat(':0', 7 - $c1); + $ip = str_replace('::', $fill, $ip); + } + // xxx::xxx + else { + $fill = ':' . str_repeat('0:', 6 - $c2 - $c1); + $ip = str_replace('::', $fill, $ip); + } + return $ip; + } + + /** + * Compresses an IPv6 address + * + * RFC 4291 allows you to compress consecutive zero pieces in an address to + * '::'. This method expects a valid IPv6 address and compresses consecutive + * zero pieces to '::'. + * + * Example: FF01:0:0:0:0:0:0:101 -> FF01::101 + * 0:0:0:0:0:0:0:1 -> ::1 + * + * @see uncompress() + * @param string $ip An IPv6 address + * @return string The compressed IPv6 address + */ + public static function compress($ip) { + // Prepare the IP to be compressed + $ip = self::uncompress($ip); + $ip_parts = self::split_v6_v4($ip); + + // Replace all leading zeros + $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]); + + // Find bunches of zeros + if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) { + $max = 0; + $pos = null; + foreach ($matches[0] as $match) { + if (strlen($match[0]) > $max) { + $max = strlen($match[0]); + $pos = $match[1]; + } + } + + $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max); + } + + if ($ip_parts[1] !== '') { + return implode(':', $ip_parts); + } + else { + return $ip_parts[0]; + } + } + + /** + * Splits an IPv6 address into the IPv6 and IPv4 representation parts + * + * RFC 4291 allows you to represent the last two parts of an IPv6 address + * using the standard IPv4 representation + * + * Example: 0:0:0:0:0:0:13.1.68.3 + * 0:0:0:0:0:FFFF:129.144.52.38 + * + * @param string $ip An IPv6 address + * @return string[] [0] contains the IPv6 represented part, and [1] the IPv4 represented part + */ + protected static function split_v6_v4($ip) { + if (strpos($ip, '.') !== false) { + $pos = strrpos($ip, ':'); + $ipv6_part = substr($ip, 0, $pos); + $ipv4_part = substr($ip, $pos + 1); + return array($ipv6_part, $ipv4_part); + } + else { + return array($ip, ''); + } + } + + /** + * Checks an IPv6 address + * + * Checks if the given IP is a valid IPv6 address + * + * @param string $ip An IPv6 address + * @return bool true if $ip is a valid IPv6 address + */ + public static function check_ipv6($ip) { + $ip = self::uncompress($ip); + list($ipv6, $ipv4) = self::split_v6_v4($ip); + $ipv6 = explode(':', $ipv6); + $ipv4 = explode('.', $ipv4); + if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) { + foreach ($ipv6 as $ipv6_part) { + // The section can't be empty + if ($ipv6_part === '') { + return false; + } + + // Nor can it be over four characters + if (strlen($ipv6_part) > 4) { + return false; + } + + // Remove leading zeros (this is safe because of the above) + $ipv6_part = ltrim($ipv6_part, '0'); + if ($ipv6_part === '') { + $ipv6_part = '0'; + } + + // Check the value is valid + $value = hexdec($ipv6_part); + if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) { + return false; + } + } + if (count($ipv4) === 4) { + foreach ($ipv4 as $ipv4_part) { + $value = (int) $ipv4_part; + if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) { + return false; + } + } + } + return true; + } + else { + return false; + } + } +} diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/IRI.php b/TeaSpeak/servers/teamspeak/lib/Requests/IRI.php new file mode 100644 index 0000000..8dc2fa2 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/IRI.php @@ -0,0 +1,1084 @@ + array( + 'port' => 674 + ), + 'dict' => array( + 'port' => 2628 + ), + 'file' => array( + 'ihost' => 'localhost' + ), + 'http' => array( + 'port' => 80, + ), + 'https' => array( + 'port' => 443, + ), + ); + + /** + * Return the entire IRI when you try and read the object as a string + * + * @return string + */ + public function __toString() { + return $this->get_iri(); + } + + /** + * Overload __set() to provide access via properties + * + * @param string $name Property name + * @param mixed $value Property value + */ + public function __set($name, $value) { + if (method_exists($this, 'set_' . $name)) { + call_user_func(array($this, 'set_' . $name), $value); + } + elseif ( + $name === 'iauthority' + || $name === 'iuserinfo' + || $name === 'ihost' + || $name === 'ipath' + || $name === 'iquery' + || $name === 'ifragment' + ) { + call_user_func(array($this, 'set_' . substr($name, 1)), $value); + } + } + + /** + * Overload __get() to provide access via properties + * + * @param string $name Property name + * @return mixed + */ + public function __get($name) { + // isset() returns false for null, we don't want to do that + // Also why we use array_key_exists below instead of isset() + $props = get_object_vars($this); + + if ( + $name === 'iri' || + $name === 'uri' || + $name === 'iauthority' || + $name === 'authority' + ) { + $method = 'get_' . $name; + $return = $this->$method(); + } + elseif (array_key_exists($name, $props)) { + $return = $this->$name; + } + // host -> ihost + elseif (($prop = 'i' . $name) && array_key_exists($prop, $props)) { + $name = $prop; + $return = $this->$prop; + } + // ischeme -> scheme + elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props)) { + $name = $prop; + $return = $this->$prop; + } + else { + trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE); + $return = null; + } + + if ($return === null && isset($this->normalization[$this->scheme][$name])) { + return $this->normalization[$this->scheme][$name]; + } + else { + return $return; + } + } + + /** + * Overload __isset() to provide access via properties + * + * @param string $name Property name + * @return bool + */ + public function __isset($name) { + return (method_exists($this, 'get_' . $name) || isset($this->$name)); + } + + /** + * Overload __unset() to provide access via properties + * + * @param string $name Property name + */ + public function __unset($name) { + if (method_exists($this, 'set_' . $name)) { + call_user_func(array($this, 'set_' . $name), ''); + } + } + + /** + * Create a new IRI object, from a specified string + * + * @param string|null $iri + */ + public function __construct($iri = null) { + $this->set_iri($iri); + } + + /** + * Create a new IRI object by resolving a relative IRI + * + * Returns false if $base is not absolute, otherwise an IRI. + * + * @param IRI|string $base (Absolute) Base IRI + * @param IRI|string $relative Relative IRI + * @return IRI|false + */ + public static function absolutize($base, $relative) { + if (!($relative instanceof Requests_IRI)) { + $relative = new Requests_IRI($relative); + } + if (!$relative->is_valid()) { + return false; + } + elseif ($relative->scheme !== null) { + return clone $relative; + } + + if (!($base instanceof Requests_IRI)) { + $base = new Requests_IRI($base); + } + if ($base->scheme === null || !$base->is_valid()) { + return false; + } + + if ($relative->get_iri() !== '') { + if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null) { + $target = clone $relative; + $target->scheme = $base->scheme; + } + else { + $target = new Requests_IRI; + $target->scheme = $base->scheme; + $target->iuserinfo = $base->iuserinfo; + $target->ihost = $base->ihost; + $target->port = $base->port; + if ($relative->ipath !== '') { + if ($relative->ipath[0] === '/') { + $target->ipath = $relative->ipath; + } + elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '') { + $target->ipath = '/' . $relative->ipath; + } + elseif (($last_segment = strrpos($base->ipath, '/')) !== false) { + $target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath; + } + else { + $target->ipath = $relative->ipath; + } + $target->ipath = $target->remove_dot_segments($target->ipath); + $target->iquery = $relative->iquery; + } + else { + $target->ipath = $base->ipath; + if ($relative->iquery !== null) { + $target->iquery = $relative->iquery; + } + elseif ($base->iquery !== null) { + $target->iquery = $base->iquery; + } + } + $target->ifragment = $relative->ifragment; + } + } + else { + $target = clone $base; + $target->ifragment = null; + } + $target->scheme_normalization(); + return $target; + } + + /** + * Parse an IRI into scheme/authority/path/query/fragment segments + * + * @param string $iri + * @return array + */ + protected function parse_iri($iri) { + $iri = trim($iri, "\x20\x09\x0A\x0C\x0D"); + $has_match = preg_match('/^((?P[^:\/?#]+):)?(\/\/(?P[^\/?#]*))?(?P[^?#]*)(\?(?P[^#]*))?(#(?P.*))?$/', $iri, $match); + if (!$has_match) { + throw new Requests_Exception('Cannot parse supplied IRI', 'iri.cannot_parse', $iri); + } + + if ($match[1] === '') { + $match['scheme'] = null; + } + if (!isset($match[3]) || $match[3] === '') { + $match['authority'] = null; + } + if (!isset($match[5])) { + $match['path'] = ''; + } + if (!isset($match[6]) || $match[6] === '') { + $match['query'] = null; + } + if (!isset($match[8]) || $match[8] === '') { + $match['fragment'] = null; + } + return $match; + } + + /** + * Remove dot segments from a path + * + * @param string $input + * @return string + */ + protected function remove_dot_segments($input) { + $output = ''; + while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') { + // A: If the input buffer begins with a prefix of "../" or "./", + // then remove that prefix from the input buffer; otherwise, + if (strpos($input, '../') === 0) { + $input = substr($input, 3); + } + elseif (strpos($input, './') === 0) { + $input = substr($input, 2); + } + // B: if the input buffer begins with a prefix of "/./" or "/.", + // where "." is a complete path segment, then replace that prefix + // with "/" in the input buffer; otherwise, + elseif (strpos($input, '/./') === 0) { + $input = substr($input, 2); + } + elseif ($input === '/.') { + $input = '/'; + } + // C: if the input buffer begins with a prefix of "/../" or "/..", + // where ".." is a complete path segment, then replace that prefix + // with "/" in the input buffer and remove the last segment and its + // preceding "/" (if any) from the output buffer; otherwise, + elseif (strpos($input, '/../') === 0) { + $input = substr($input, 3); + $output = substr_replace($output, '', strrpos($output, '/')); + } + elseif ($input === '/..') { + $input = '/'; + $output = substr_replace($output, '', strrpos($output, '/')); + } + // D: if the input buffer consists only of "." or "..", then remove + // that from the input buffer; otherwise, + elseif ($input === '.' || $input === '..') { + $input = ''; + } + // E: move the first path segment in the input buffer to the end of + // the output buffer, including the initial "/" character (if any) + // and any subsequent characters up to, but not including, the next + // "/" character or the end of the input buffer + elseif (($pos = strpos($input, '/', 1)) !== false) { + $output .= substr($input, 0, $pos); + $input = substr_replace($input, '', 0, $pos); + } + else { + $output .= $input; + $input = ''; + } + } + return $output . $input; + } + + /** + * Replace invalid character with percent encoding + * + * @param string $string Input string + * @param string $extra_chars Valid characters not in iunreserved or + * iprivate (this is ASCII-only) + * @param bool $iprivate Allow iprivate + * @return string + */ + protected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false) { + // Normalize as many pct-encoded sections as possible + $string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array(&$this, 'remove_iunreserved_percent_encoded'), $string); + + // Replace invalid percent characters + $string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string); + + // Add unreserved and % to $extra_chars (the latter is safe because all + // pct-encoded sections are now valid). + $extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%'; + + // Now replace any bytes that aren't allowed with their pct-encoded versions + $position = 0; + $strlen = strlen($string); + while (($position += strspn($string, $extra_chars, $position)) < $strlen) { + $value = ord($string[$position]); + + // Start position + $start = $position; + + // By default we are valid + $valid = true; + + // No one byte sequences are valid due to the while. + // Two byte sequence: + if (($value & 0xE0) === 0xC0) { + $character = ($value & 0x1F) << 6; + $length = 2; + $remaining = 1; + } + // Three byte sequence: + elseif (($value & 0xF0) === 0xE0) { + $character = ($value & 0x0F) << 12; + $length = 3; + $remaining = 2; + } + // Four byte sequence: + elseif (($value & 0xF8) === 0xF0) { + $character = ($value & 0x07) << 18; + $length = 4; + $remaining = 3; + } + // Invalid byte: + else { + $valid = false; + $length = 1; + $remaining = 0; + } + + if ($remaining) { + if ($position + $length <= $strlen) { + for ($position++; $remaining; $position++) { + $value = ord($string[$position]); + + // Check that the byte is valid, then add it to the character: + if (($value & 0xC0) === 0x80) { + $character |= ($value & 0x3F) << (--$remaining * 6); + } + // If it is invalid, count the sequence as invalid and reprocess the current byte: + else { + $valid = false; + $position--; + break; + } + } + } + else { + $position = $strlen - 1; + $valid = false; + } + } + + // Percent encode anything invalid or not in ucschar + if ( + // Invalid sequences + !$valid + // Non-shortest form sequences are invalid + || $length > 1 && $character <= 0x7F + || $length > 2 && $character <= 0x7FF + || $length > 3 && $character <= 0xFFFF + // Outside of range of ucschar codepoints + // Noncharacters + || ($character & 0xFFFE) === 0xFFFE + || $character >= 0xFDD0 && $character <= 0xFDEF + || ( + // Everything else not in ucschar + $character > 0xD7FF && $character < 0xF900 + || $character < 0xA0 + || $character > 0xEFFFD + ) + && ( + // Everything not in iprivate, if it applies + !$iprivate + || $character < 0xE000 + || $character > 0x10FFFD + ) + ) { + // If we were a character, pretend we weren't, but rather an error. + if ($valid) { + $position--; + } + + for ($j = $start; $j <= $position; $j++) { + $string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1); + $j += 2; + $position += 2; + $strlen += 2; + } + } + } + + return $string; + } + + /** + * Callback function for preg_replace_callback. + * + * Removes sequences of percent encoded bytes that represent UTF-8 + * encoded characters in iunreserved + * + * @param array $match PCRE match + * @return string Replacement + */ + protected function remove_iunreserved_percent_encoded($match) { + // As we just have valid percent encoded sequences we can just explode + // and ignore the first member of the returned array (an empty string). + $bytes = explode('%', $match[0]); + + // Initialize the new string (this is what will be returned) and that + // there are no bytes remaining in the current sequence (unsurprising + // at the first byte!). + $string = ''; + $remaining = 0; + + // Loop over each and every byte, and set $value to its value + for ($i = 1, $len = count($bytes); $i < $len; $i++) { + $value = hexdec($bytes[$i]); + + // If we're the first byte of sequence: + if (!$remaining) { + // Start position + $start = $i; + + // By default we are valid + $valid = true; + + // One byte sequence: + if ($value <= 0x7F) { + $character = $value; + $length = 1; + } + // Two byte sequence: + elseif (($value & 0xE0) === 0xC0) { + $character = ($value & 0x1F) << 6; + $length = 2; + $remaining = 1; + } + // Three byte sequence: + elseif (($value & 0xF0) === 0xE0) { + $character = ($value & 0x0F) << 12; + $length = 3; + $remaining = 2; + } + // Four byte sequence: + elseif (($value & 0xF8) === 0xF0) { + $character = ($value & 0x07) << 18; + $length = 4; + $remaining = 3; + } + // Invalid byte: + else { + $valid = false; + $remaining = 0; + } + } + // Continuation byte: + else { + // Check that the byte is valid, then add it to the character: + if (($value & 0xC0) === 0x80) { + $remaining--; + $character |= ($value & 0x3F) << ($remaining * 6); + } + // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence: + else { + $valid = false; + $remaining = 0; + $i--; + } + } + + // If we've reached the end of the current byte sequence, append it to Unicode::$data + if (!$remaining) { + // Percent encode anything invalid or not in iunreserved + if ( + // Invalid sequences + !$valid + // Non-shortest form sequences are invalid + || $length > 1 && $character <= 0x7F + || $length > 2 && $character <= 0x7FF + || $length > 3 && $character <= 0xFFFF + // Outside of range of iunreserved codepoints + || $character < 0x2D + || $character > 0xEFFFD + // Noncharacters + || ($character & 0xFFFE) === 0xFFFE + || $character >= 0xFDD0 && $character <= 0xFDEF + // Everything else not in iunreserved (this is all BMP) + || $character === 0x2F + || $character > 0x39 && $character < 0x41 + || $character > 0x5A && $character < 0x61 + || $character > 0x7A && $character < 0x7E + || $character > 0x7E && $character < 0xA0 + || $character > 0xD7FF && $character < 0xF900 + ) { + for ($j = $start; $j <= $i; $j++) { + $string .= '%' . strtoupper($bytes[$j]); + } + } + else { + for ($j = $start; $j <= $i; $j++) { + $string .= chr(hexdec($bytes[$j])); + } + } + } + } + + // If we have any bytes left over they are invalid (i.e., we are + // mid-way through a multi-byte sequence) + if ($remaining) { + for ($j = $start; $j < $len; $j++) { + $string .= '%' . strtoupper($bytes[$j]); + } + } + + return $string; + } + + protected function scheme_normalization() { + if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo']) { + $this->iuserinfo = null; + } + if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost']) { + $this->ihost = null; + } + if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port']) { + $this->port = null; + } + if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath']) { + $this->ipath = ''; + } + if (isset($this->ihost) && empty($this->ipath)) { + $this->ipath = '/'; + } + if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery']) { + $this->iquery = null; + } + if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment']) { + $this->ifragment = null; + } + } + + /** + * Check if the object represents a valid IRI. This needs to be done on each + * call as some things change depending on another part of the IRI. + * + * @return bool + */ + public function is_valid() { + $isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null; + if ($this->ipath !== '' && + ( + $isauthority && $this->ipath[0] !== '/' || + ( + $this->scheme === null && + !$isauthority && + strpos($this->ipath, ':') !== false && + (strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/')) + ) + ) + ) { + return false; + } + + return true; + } + + /** + * Set the entire IRI. Returns true on success, false on failure (if there + * are any invalid characters). + * + * @param string $iri + * @return bool + */ + protected function set_iri($iri) { + static $cache; + if (!$cache) { + $cache = array(); + } + + if ($iri === null) { + return true; + } + if (isset($cache[$iri])) { + list($this->scheme, + $this->iuserinfo, + $this->ihost, + $this->port, + $this->ipath, + $this->iquery, + $this->ifragment, + $return) = $cache[$iri]; + return $return; + } + + $parsed = $this->parse_iri((string) $iri); + + $return = $this->set_scheme($parsed['scheme']) + && $this->set_authority($parsed['authority']) + && $this->set_path($parsed['path']) + && $this->set_query($parsed['query']) + && $this->set_fragment($parsed['fragment']); + + $cache[$iri] = array($this->scheme, + $this->iuserinfo, + $this->ihost, + $this->port, + $this->ipath, + $this->iquery, + $this->ifragment, + $return); + return $return; + } + + /** + * Set the scheme. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @param string $scheme + * @return bool + */ + protected function set_scheme($scheme) { + if ($scheme === null) { + $this->scheme = null; + } + elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme)) { + $this->scheme = null; + return false; + } + else { + $this->scheme = strtolower($scheme); + } + return true; + } + + /** + * Set the authority. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @param string $authority + * @return bool + */ + protected function set_authority($authority) { + static $cache; + if (!$cache) { + $cache = array(); + } + + if ($authority === null) { + $this->iuserinfo = null; + $this->ihost = null; + $this->port = null; + return true; + } + if (isset($cache[$authority])) { + list($this->iuserinfo, + $this->ihost, + $this->port, + $return) = $cache[$authority]; + + return $return; + } + + $remaining = $authority; + if (($iuserinfo_end = strrpos($remaining, '@')) !== false) { + $iuserinfo = substr($remaining, 0, $iuserinfo_end); + $remaining = substr($remaining, $iuserinfo_end + 1); + } + else { + $iuserinfo = null; + } + if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false) { + $port = substr($remaining, $port_start + 1); + if ($port === false || $port === '') { + $port = null; + } + $remaining = substr($remaining, 0, $port_start); + } + else { + $port = null; + } + + $return = $this->set_userinfo($iuserinfo) && + $this->set_host($remaining) && + $this->set_port($port); + + $cache[$authority] = array($this->iuserinfo, + $this->ihost, + $this->port, + $return); + + return $return; + } + + /** + * Set the iuserinfo. + * + * @param string $iuserinfo + * @return bool + */ + protected function set_userinfo($iuserinfo) { + if ($iuserinfo === null) { + $this->iuserinfo = null; + } + else { + $this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:'); + $this->scheme_normalization(); + } + + return true; + } + + /** + * Set the ihost. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @param string $ihost + * @return bool + */ + protected function set_host($ihost) { + if ($ihost === null) { + $this->ihost = null; + return true; + } + if (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']') { + if (Requests_IPv6::check_ipv6(substr($ihost, 1, -1))) { + $this->ihost = '[' . Requests_IPv6::compress(substr($ihost, 1, -1)) . ']'; + } + else { + $this->ihost = null; + return false; + } + } + else { + $ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;='); + + // Lowercase, but ignore pct-encoded sections (as they should + // remain uppercase). This must be done after the previous step + // as that can add unescaped characters. + $position = 0; + $strlen = strlen($ihost); + while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen) { + if ($ihost[$position] === '%') { + $position += 3; + } + else { + $ihost[$position] = strtolower($ihost[$position]); + $position++; + } + } + + $this->ihost = $ihost; + } + + $this->scheme_normalization(); + + return true; + } + + /** + * Set the port. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @param string $port + * @return bool + */ + protected function set_port($port) { + if ($port === null) { + $this->port = null; + return true; + } + + if (strspn($port, '0123456789') === strlen($port)) { + $this->port = (int) $port; + $this->scheme_normalization(); + return true; + } + + $this->port = null; + return false; + } + + /** + * Set the ipath. + * + * @param string $ipath + * @return bool + */ + protected function set_path($ipath) { + static $cache; + if (!$cache) { + $cache = array(); + } + + $ipath = (string) $ipath; + + if (isset($cache[$ipath])) { + $this->ipath = $cache[$ipath][(int) ($this->scheme !== null)]; + } + else { + $valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/'); + $removed = $this->remove_dot_segments($valid); + + $cache[$ipath] = array($valid, $removed); + $this->ipath = ($this->scheme !== null) ? $removed : $valid; + } + $this->scheme_normalization(); + return true; + } + + /** + * Set the iquery. + * + * @param string $iquery + * @return bool + */ + protected function set_query($iquery) { + if ($iquery === null) { + $this->iquery = null; + } + else { + $this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true); + $this->scheme_normalization(); + } + return true; + } + + /** + * Set the ifragment. + * + * @param string $ifragment + * @return bool + */ + protected function set_fragment($ifragment) { + if ($ifragment === null) { + $this->ifragment = null; + } + else { + $this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?'); + $this->scheme_normalization(); + } + return true; + } + + /** + * Convert an IRI to a URI (or parts thereof) + * + * @param string|bool IRI to convert (or false from {@see get_iri}) + * @return string|false URI if IRI is valid, false otherwise. + */ + protected function to_uri($string) { + if (!is_string($string)) { + return false; + } + + static $non_ascii; + if (!$non_ascii) { + $non_ascii = implode('', range("\x80", "\xFF")); + } + + $position = 0; + $strlen = strlen($string); + while (($position += strcspn($string, $non_ascii, $position)) < $strlen) { + $string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1); + $position += 3; + $strlen += 2; + } + + return $string; + } + + /** + * Get the complete IRI + * + * @return string + */ + protected function get_iri() { + if (!$this->is_valid()) { + return false; + } + + $iri = ''; + if ($this->scheme !== null) { + $iri .= $this->scheme . ':'; + } + if (($iauthority = $this->get_iauthority()) !== null) { + $iri .= '//' . $iauthority; + } + $iri .= $this->ipath; + if ($this->iquery !== null) { + $iri .= '?' . $this->iquery; + } + if ($this->ifragment !== null) { + $iri .= '#' . $this->ifragment; + } + + return $iri; + } + + /** + * Get the complete URI + * + * @return string + */ + protected function get_uri() { + return $this->to_uri($this->get_iri()); + } + + /** + * Get the complete iauthority + * + * @return string + */ + protected function get_iauthority() { + if ($this->iuserinfo === null && $this->ihost === null && $this->port === null) { + return null; + } + + $iauthority = ''; + if ($this->iuserinfo !== null) { + $iauthority .= $this->iuserinfo . '@'; + } + if ($this->ihost !== null) { + $iauthority .= $this->ihost; + } + if ($this->port !== null) { + $iauthority .= ':' . $this->port; + } + return $iauthority; + } + + /** + * Get the complete authority + * + * @return string + */ + protected function get_authority() { + $iauthority = $this->get_iauthority(); + if (is_string($iauthority)) { + return $this->to_uri($iauthority); + } + else { + return $iauthority; + } + } +} diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Proxy.php b/TeaSpeak/servers/teamspeak/lib/Requests/Proxy.php new file mode 100644 index 0000000..ac7c1d6 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Proxy.php @@ -0,0 +1,35 @@ +proxy = $args; + } + elseif (is_array($args)) { + if (count($args) == 1) { + list($this->proxy) = $args; + } + elseif (count($args) == 3) { + list($this->proxy, $this->user, $this->pass) = $args; + $this->use_authentication = true; + } + else { + throw new Requests_Exception('Invalid number of arguments', 'proxyhttpbadargs'); + } + } + } + + /** + * Register the necessary callbacks + * + * @since 1.6 + * @see curl_before_send + * @see fsockopen_remote_socket + * @see fsockopen_remote_host_path + * @see fsockopen_header + * @param Requests_Hooks $hooks Hook system + */ + public function register(Requests_Hooks &$hooks) { + $hooks->register('curl.before_send', array(&$this, 'curl_before_send')); + + $hooks->register('fsockopen.remote_socket', array(&$this, 'fsockopen_remote_socket')); + $hooks->register('fsockopen.remote_host_path', array(&$this, 'fsockopen_remote_host_path')); + if ($this->use_authentication) { + $hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header')); + } + } + + /** + * Set cURL parameters before the data is sent + * + * @since 1.6 + * @param resource $handle cURL resource + */ + public function curl_before_send(&$handle) { + curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); + curl_setopt($handle, CURLOPT_PROXY, $this->proxy); + + if ($this->use_authentication) { + curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY); + curl_setopt($handle, CURLOPT_PROXYUSERPWD, $this->get_auth_string()); + } + } + + /** + * Alter remote socket information before opening socket connection + * + * @since 1.6 + * @param string $remote_socket Socket connection string + */ + public function fsockopen_remote_socket(&$remote_socket) { + $remote_socket = $this->proxy; + } + + /** + * Alter remote path before getting stream data + * + * @since 1.6 + * @param string $path Path to send in HTTP request string ("GET ...") + * @param string $url Full URL we're requesting + */ + public function fsockopen_remote_host_path(&$path, $url) { + $path = $url; + } + + /** + * Add extra headers to the request before sending + * + * @since 1.6 + * @param string $out HTTP header string + */ + public function fsockopen_header(&$out) { + $out .= sprintf("Proxy-Authorization: Basic %s\r\n", base64_encode($this->get_auth_string())); + } + + /** + * Get the authentication string (user:pass) + * + * @since 1.6 + * @return string + */ + public function get_auth_string() { + return $this->user . ':' . $this->pass; + } +} \ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Response.php b/TeaSpeak/servers/teamspeak/lib/Requests/Response.php new file mode 100644 index 0000000..3152fb6 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Response.php @@ -0,0 +1,121 @@ +headers = new Requests_Response_Headers(); + $this->cookies = new Requests_Cookie_Jar(); + } + + /** + * Response body + * + * @var string + */ + public $body = ''; + + /** + * Raw HTTP data from the transport + * + * @var string + */ + public $raw = ''; + + /** + * Headers, as an associative array + * + * @var Requests_Response_Headers Array-like object representing headers + */ + public $headers = array(); + + /** + * Status code, false if non-blocking + * + * @var integer|boolean + */ + public $status_code = false; + + /** + * Protocol version, false if non-blocking + * @var float|boolean + */ + public $protocol_version = false; + + /** + * Whether the request succeeded or not + * + * @var boolean + */ + public $success = false; + + /** + * Number of redirects the request used + * + * @var integer + */ + public $redirects = 0; + + /** + * URL requested + * + * @var string + */ + public $url = ''; + + /** + * Previous requests (from redirects) + * + * @var array Array of Requests_Response objects + */ + public $history = array(); + + /** + * Cookies from the request + * + * @var Requests_Cookie_Jar Array-like object representing a cookie jar + */ + public $cookies = array(); + + /** + * Is the response a redirect? + * + * @return boolean True if redirect (3xx status), false if not. + */ + public function is_redirect() { + $code = $this->status_code; + return in_array($code, array(300, 301, 302, 303, 307)) || $code > 307 && $code < 400; + } + + /** + * Throws an exception if the request was not successful + * + * @throws Requests_Exception If `$allow_redirects` is false, and code is 3xx (`response.no_redirects`) + * @throws Requests_Exception_HTTP On non-successful status code. Exception class corresponds to code (e.g. {@see Requests_Exception_HTTP_404}) + * @param boolean $allow_redirects Set to false to throw on a 3xx as well + */ + public function throw_for_status($allow_redirects = true) { + if ($this->is_redirect()) { + if (!$allow_redirects) { + throw new Requests_Exception('Redirection not allowed', 'response.no_redirects', $this); + } + } + elseif (!$this->success) { + $exception = Requests_Exception_HTTP::get_class($this->status_code); + throw new $exception(null, $this); + } + } +} diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Response/Headers.php b/TeaSpeak/servers/teamspeak/lib/Requests/Response/Headers.php new file mode 100644 index 0000000..cc6a208 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Response/Headers.php @@ -0,0 +1,98 @@ +data[$key])) { + return null; + } + + return $this->flatten($this->data[$key]); + } + + /** + * Set the given item + * + * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`) + * + * @param string $key Item name + * @param string $value Item value + */ + public function offsetSet($key, $value) { + if ($key === null) { + throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset'); + } + + $key = strtolower($key); + + if (!isset($this->data[$key])) { + $this->data[$key] = array(); + } + + $this->data[$key][] = $value; + } + + /** + * Get all values for a given header + * + * @param string $key + * @return array Header values + */ + public function getValues($key) { + $key = strtolower($key); + if (!isset($this->data[$key])) { + return null; + } + + return $this->data[$key]; + } + + /** + * Flattens a value into a string + * + * Converts an array into a string by imploding values with a comma, as per + * RFC2616's rules for folding headers. + * + * @param string|array $value Value to flatten + * @return string Flattened value + */ + public function flatten($value) { + if (is_array($value)) { + $value = implode(',', $value); + } + + return $value; + } + + /** + * Get an iterator for the data + * + * Converts the internal + * @return ArrayIterator + */ + public function getIterator() { + return new Requests_Utility_FilteredIterator($this->data, array($this, 'flatten')); + } +} diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/SSL.php b/TeaSpeak/servers/teamspeak/lib/Requests/SSL.php new file mode 100644 index 0000000..2b03768 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/SSL.php @@ -0,0 +1,152 @@ +useragent = 'X';` + * + * @var array + */ + public $options = array(); + + /** + * Create a new session + * + * @param string|null $url Base URL for requests + * @param array $headers Default headers for requests + * @param array $data Default data for requests + * @param array $options Default options for requests + */ + public function __construct($url = null, $headers = array(), $data = array(), $options = array()) { + $this->url = $url; + $this->headers = $headers; + $this->data = $data; + $this->options = $options; + + if (empty($this->options['cookies'])) { + $this->options['cookies'] = new Requests_Cookie_Jar(); + } + } + + /** + * Get a property's value + * + * @param string $key Property key + * @return mixed|null Property value, null if none found + */ + public function __get($key) { + if (isset($this->options[$key])) { + return $this->options[$key]; + } + + return null; + } + + /** + * Set a property's value + * + * @param string $key Property key + * @param mixed $value Property value + */ + public function __set($key, $value) { + $this->options[$key] = $value; + } + + /** + * Remove a property's value + * + * @param string $key Property key + */ + public function __isset($key) { + return isset($this->options[$key]); + } + + /** + * Remove a property's value + * + * @param string $key Property key + */ + public function __unset($key) { + if (isset($this->options[$key])) { + unset($this->options[$key]); + } + } + + /**#@+ + * @see request() + * @param string $url + * @param array $headers + * @param array $options + * @return Requests_Response + */ + /** + * Send a GET request + */ + public function get($url, $headers = array(), $options = array()) { + return $this->request($url, $headers, null, Requests::GET, $options); + } + + /** + * Send a HEAD request + */ + public function head($url, $headers = array(), $options = array()) { + return $this->request($url, $headers, null, Requests::HEAD, $options); + } + + /** + * Send a DELETE request + */ + public function delete($url, $headers = array(), $options = array()) { + return $this->request($url, $headers, null, Requests::DELETE, $options); + } + /**#@-*/ + + /**#@+ + * @see request() + * @param string $url + * @param array $headers + * @param array $data + * @param array $options + * @return Requests_Response + */ + /** + * Send a POST request + */ + public function post($url, $headers = array(), $data = array(), $options = array()) { + return $this->request($url, $headers, $data, Requests::POST, $options); + } + + /** + * Send a PUT request + */ + public function put($url, $headers = array(), $data = array(), $options = array()) { + return $this->request($url, $headers, $data, Requests::PUT, $options); + } + + /** + * Send a PATCH request + * + * Note: Unlike {@see post} and {@see put}, `$headers` is required, as the + * specification recommends that should send an ETag + * + * @link https://tools.ietf.org/html/rfc5789 + */ + public function patch($url, $headers, $data = array(), $options = array()) { + return $this->request($url, $headers, $data, Requests::PATCH, $options); + } + /**#@-*/ + + /** + * Main interface for HTTP requests + * + * This method initiates a request and sends it via a transport before + * parsing. + * + * @see Requests::request() + * + * @throws Requests_Exception On invalid URLs (`nonhttp`) + * + * @param string $url URL to request + * @param array $headers Extra headers to send with the request + * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests + * @param string $type HTTP request type (use Requests constants) + * @param array $options Options for the request (see {@see Requests::request}) + * @return Requests_Response + */ + public function request($url, $headers = array(), $data = array(), $type = Requests::GET, $options = array()) { + $request = $this->merge_request(compact('url', 'headers', 'data', 'options')); + + return Requests::request($request['url'], $request['headers'], $request['data'], $type, $request['options']); + } + + /** + * Send multiple HTTP requests simultaneously + * + * @see Requests::request_multiple() + * + * @param array $requests Requests data (see {@see Requests::request_multiple}) + * @param array $options Global and default options (see {@see Requests::request}) + * @return array Responses (either Requests_Response or a Requests_Exception object) + */ + public function request_multiple($requests, $options = array()) { + foreach ($requests as $key => $request) { + $requests[$key] = $this->merge_request($request, false); + } + + $options = array_merge($this->options, $options); + + // Disallow forcing the type, as that's a per request setting + unset($options['type']); + + return Requests::request_multiple($requests, $options); + } + + /** + * Merge a request's data with the default data + * + * @param array $request Request data (same form as {@see request_multiple}) + * @param boolean $merge_options Should we merge options as well? + * @return array Request data + */ + protected function merge_request($request, $merge_options = true) { + if ($this->url !== null) { + $request['url'] = Requests_IRI::absolutize($this->url, $request['url']); + $request['url'] = $request['url']->uri; + } + + if (empty($request['headers'])) { + $request['headers'] = array(); + } + $request['headers'] = array_merge($this->headers, $request['headers']); + + if (empty($request['data'])) { + if (is_array($this->data)) { + $request['data'] = $this->data; + } + } + elseif (is_array($request['data']) && is_array($this->data)) { + $request['data'] = array_merge($this->data, $request['data']); + } + + if ($merge_options !== false) { + $request['options'] = array_merge($this->options, $request['options']); + + // Disallow forcing the type, as that's a per request setting + unset($request['options']['type']); + } + + return $request; + } +} diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Transport.php b/TeaSpeak/servers/teamspeak/lib/Requests/Transport.php new file mode 100644 index 0000000..7e4a262 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Transport.php @@ -0,0 +1,41 @@ +version = $curl['version_number']; + $this->handle = curl_init(); + + curl_setopt($this->handle, CURLOPT_HEADER, false); + curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1); + if ($this->version >= self::CURL_7_10_5) { + curl_setopt($this->handle, CURLOPT_ENCODING, ''); + } + if (defined('CURLOPT_PROTOCOLS')) { + curl_setopt($this->handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); + } + if (defined('CURLOPT_REDIR_PROTOCOLS')) { + curl_setopt($this->handle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); + } + } + + /** + * Destructor + */ + public function __destruct() { + if (is_resource($this->handle)) { + curl_close($this->handle); + } + } + + /** + * Perform a request + * + * @throws Requests_Exception On a cURL error (`curlerror`) + * + * @param string $url URL to request + * @param array $headers Associative array of request headers + * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD + * @param array $options Request options, see {@see Requests::response()} for documentation + * @return string Raw HTTP result + */ + public function request($url, $headers = array(), $data = array(), $options = array()) { + $this->hooks = $options['hooks']; + + $this->setup_handle($url, $headers, $data, $options); + + $options['hooks']->dispatch('curl.before_send', array(&$this->handle)); + + if ($options['filename'] !== false) { + $this->stream_handle = fopen($options['filename'], 'wb'); + } + + $this->response_data = ''; + $this->response_bytes = 0; + $this->response_byte_limit = false; + if ($options['max_bytes'] !== false) { + $this->response_byte_limit = $options['max_bytes']; + } + + if (isset($options['verify'])) { + if ($options['verify'] === false) { + curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($this->handle, CURLOPT_SSL_VERIFYPEER, 0); + } + elseif (is_string($options['verify'])) { + curl_setopt($this->handle, CURLOPT_CAINFO, $options['verify']); + } + } + + if (isset($options['verifyname']) && $options['verifyname'] === false) { + curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0); + } + + curl_exec($this->handle); + $response = $this->response_data; + + $options['hooks']->dispatch('curl.after_send', array()); + + if (curl_errno($this->handle) === 23 || curl_errno($this->handle) === 61) { + // Reset encoding and try again + curl_setopt($this->handle, CURLOPT_ENCODING, 'none'); + + $this->response_data = ''; + $this->response_bytes = 0; + curl_exec($this->handle); + $response = $this->response_data; + } + + $this->process_response($response, $options); + + // Need to remove the $this reference from the curl handle. + // Otherwise Requests_Transport_cURL wont be garbage collected and the curl_close() will never be called. + curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, null); + curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, null); + + return $this->headers; + } + + /** + * Send multiple requests simultaneously + * + * @param array $requests Request data + * @param array $options Global options + * @return array Array of Requests_Response objects (may contain Requests_Exception or string responses as well) + */ + public function request_multiple($requests, $options) { + // If you're not requesting, we can't get any responses ¯\_(ツ)_/¯ + if (empty($requests)) { + return array(); + } + + $multihandle = curl_multi_init(); + $subrequests = array(); + $subhandles = array(); + + $class = get_class($this); + foreach ($requests as $id => $request) { + $subrequests[$id] = new $class(); + $subhandles[$id] = $subrequests[$id]->get_subrequest_handle($request['url'], $request['headers'], $request['data'], $request['options']); + $request['options']['hooks']->dispatch('curl.before_multi_add', array(&$subhandles[$id])); + curl_multi_add_handle($multihandle, $subhandles[$id]); + } + + $completed = 0; + $responses = array(); + + $request['options']['hooks']->dispatch('curl.before_multi_exec', array(&$multihandle)); + + do { + $active = false; + + do { + $status = curl_multi_exec($multihandle, $active); + } + while ($status === CURLM_CALL_MULTI_PERFORM); + + $to_process = array(); + + // Read the information as needed + while ($done = curl_multi_info_read($multihandle)) { + $key = array_search($done['handle'], $subhandles, true); + if (!isset($to_process[$key])) { + $to_process[$key] = $done; + } + } + + // Parse the finished requests before we start getting the new ones + foreach ($to_process as $key => $done) { + $options = $requests[$key]['options']; + if (CURLE_OK !== $done['result']) { + //get error string for handle. + $reason = curl_error($done['handle']); + $exception = new Requests_Exception_Transport_cURL( + $reason, + Requests_Exception_Transport_cURL::EASY, + $done['handle'], + $done['result'] + ); + $responses[$key] = $exception; + $options['hooks']->dispatch('transport.internal.parse_error', array(&$responses[$key], $requests[$key])); + } + else { + $responses[$key] = $subrequests[$key]->process_response($subrequests[$key]->response_data, $options); + + $options['hooks']->dispatch('transport.internal.parse_response', array(&$responses[$key], $requests[$key])); + } + + curl_multi_remove_handle($multihandle, $done['handle']); + curl_close($done['handle']); + + if (!is_string($responses[$key])) { + $options['hooks']->dispatch('multiple.request.complete', array(&$responses[$key], $key)); + } + $completed++; + } + } + while ($active || $completed < count($subrequests)); + + $request['options']['hooks']->dispatch('curl.after_multi_exec', array(&$multihandle)); + + curl_multi_close($multihandle); + + return $responses; + } + + /** + * Get the cURL handle for use in a multi-request + * + * @param string $url URL to request + * @param array $headers Associative array of request headers + * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD + * @param array $options Request options, see {@see Requests::response()} for documentation + * @return resource Subrequest's cURL handle + */ + public function &get_subrequest_handle($url, $headers, $data, $options) { + $this->setup_handle($url, $headers, $data, $options); + + if ($options['filename'] !== false) { + $this->stream_handle = fopen($options['filename'], 'wb'); + } + + $this->response_data = ''; + $this->response_bytes = 0; + $this->response_byte_limit = false; + if ($options['max_bytes'] !== false) { + $this->response_byte_limit = $options['max_bytes']; + } + $this->hooks = $options['hooks']; + + return $this->handle; + } + + /** + * Setup the cURL handle for the given data + * + * @param string $url URL to request + * @param array $headers Associative array of request headers + * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD + * @param array $options Request options, see {@see Requests::response()} for documentation + */ + protected function setup_handle($url, $headers, $data, $options) { + $options['hooks']->dispatch('curl.before_request', array(&$this->handle)); + + // Force closing the connection for old versions of cURL (<7.22). + if ( ! isset( $headers['Connection'] ) ) { + $headers['Connection'] = 'close'; + } + + $headers = Requests::flatten($headers); + + if (!empty($data)) { + $data_format = $options['data_format']; + + if ($data_format === 'query') { + $url = self::format_get($url, $data); + $data = ''; + } + elseif (!is_string($data)) { + $data = http_build_query($data, null, '&'); + } + } + + switch ($options['type']) { + case Requests::POST: + curl_setopt($this->handle, CURLOPT_POST, true); + curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); + break; + case Requests::HEAD: + curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); + curl_setopt($this->handle, CURLOPT_NOBODY, true); + break; + case Requests::TRACE: + curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); + break; + case Requests::PATCH: + case Requests::PUT: + case Requests::DELETE: + case Requests::OPTIONS: + default: + curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); + if (!empty($data)) { + curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); + } + } + + // cURL requires a minimum timeout of 1 second when using the system + // DNS resolver, as it uses `alarm()`, which is second resolution only. + // There's no way to detect which DNS resolver is being used from our + // end, so we need to round up regardless of the supplied timeout. + // + // https://github.com/curl/curl/blob/4f45240bc84a9aa648c8f7243be7b79e9f9323a5/lib/hostip.c#L606-L609 + $timeout = max($options['timeout'], 1); + + if (is_int($timeout) || $this->version < self::CURL_7_16_2) { + curl_setopt($this->handle, CURLOPT_TIMEOUT, ceil($timeout)); + } + else { + curl_setopt($this->handle, CURLOPT_TIMEOUT_MS, round($timeout * 1000)); + } + + if (is_int($options['connect_timeout']) || $this->version < self::CURL_7_16_2) { + curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, ceil($options['connect_timeout'])); + } + else { + curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT_MS, round($options['connect_timeout'] * 1000)); + } + curl_setopt($this->handle, CURLOPT_URL, $url); + curl_setopt($this->handle, CURLOPT_REFERER, $url); + curl_setopt($this->handle, CURLOPT_USERAGENT, $options['useragent']); + if (!empty($headers)) { + curl_setopt($this->handle, CURLOPT_HTTPHEADER, $headers); + } + if ($options['protocol_version'] === 1.1) { + curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + } + else { + curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + } + + if (true === $options['blocking']) { + curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, array(&$this, 'stream_headers')); + curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, array(&$this, 'stream_body')); + curl_setopt($this->handle, CURLOPT_BUFFERSIZE, Requests::BUFFER_SIZE); + } + } + + /** + * Process a response + * + * @param string $response Response data from the body + * @param array $options Request options + * @return string HTTP response data including headers + */ + public function process_response($response, $options) { + if ($options['blocking'] === false) { + $fake_headers = ''; + $options['hooks']->dispatch('curl.after_request', array(&$fake_headers)); + return false; + } + if ($options['filename'] !== false) { + fclose($this->stream_handle); + $this->headers = trim($this->headers); + } + else { + $this->headers .= $response; + } + + if (curl_errno($this->handle)) { + $error = sprintf( + 'cURL error %s: %s', + curl_errno($this->handle), + curl_error($this->handle) + ); + throw new Requests_Exception($error, 'curlerror', $this->handle); + } + $this->info = curl_getinfo($this->handle); + + $options['hooks']->dispatch('curl.after_request', array(&$this->headers, &$this->info)); + return $this->headers; + } + + /** + * Collect the headers as they are received + * + * @param resource $handle cURL resource + * @param string $headers Header string + * @return integer Length of provided header + */ + public function stream_headers($handle, $headers) { + // Why do we do this? cURL will send both the final response and any + // interim responses, such as a 100 Continue. We don't need that. + // (We may want to keep this somewhere just in case) + if ($this->done_headers) { + $this->headers = ''; + $this->done_headers = false; + } + $this->headers .= $headers; + + if ($headers === "\r\n") { + $this->done_headers = true; + } + return strlen($headers); + } + + /** + * Collect data as it's received + * + * @since 1.6.1 + * + * @param resource $handle cURL resource + * @param string $data Body data + * @return integer Length of provided data + */ + public function stream_body($handle, $data) { + $this->hooks->dispatch('request.progress', array($data, $this->response_bytes, $this->response_byte_limit)); + $data_length = strlen($data); + + // Are we limiting the response size? + if ($this->response_byte_limit) { + if ($this->response_bytes === $this->response_byte_limit) { + // Already at maximum, move on + return $data_length; + } + + if (($this->response_bytes + $data_length) > $this->response_byte_limit) { + // Limit the length + $limited_length = ($this->response_byte_limit - $this->response_bytes); + $data = substr($data, 0, $limited_length); + } + } + + if ($this->stream_handle) { + fwrite($this->stream_handle, $data); + } + else { + $this->response_data .= $data; + } + + $this->response_bytes += strlen($data); + return $data_length; + } + + /** + * Format a URL given GET data + * + * @param string $url + * @param array|object $data Data to build query using, see {@see https://secure.php.net/http_build_query} + * @return string URL with data + */ + protected static function format_get($url, $data) { + if (!empty($data)) { + $url_parts = parse_url($url); + if (empty($url_parts['query'])) { + $query = $url_parts['query'] = ''; + } + else { + $query = $url_parts['query']; + } + + $query .= '&' . http_build_query($data, null, '&'); + $query = trim($query, '&'); + + if (empty($url_parts['query'])) { + $url .= '?' . $query; + } + else { + $url = str_replace($url_parts['query'], $query, $url); + } + } + return $url; + } + + /** + * Whether this transport is valid + * + * @codeCoverageIgnore + * @return boolean True if the transport is valid, false otherwise. + */ + public static function test($capabilities = array()) { + if (!function_exists('curl_init') || !function_exists('curl_exec')) { + return false; + } + + // If needed, check that our installed curl version supports SSL + if (isset($capabilities['ssl']) && $capabilities['ssl']) { + $curl_version = curl_version(); + if (!(CURL_VERSION_SSL & $curl_version['features'])) { + return false; + } + } + + return true; + } +} diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Transport/cacert.pem b/TeaSpeak/servers/teamspeak/lib/Requests/Transport/cacert.pem new file mode 100644 index 0000000..56ece1a --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Transport/cacert.pem @@ -0,0 +1,3554 @@ +## +## ca-bundle.crt -- Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## + +# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $ + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 1 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy +MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE +NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i +o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq +kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 +RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 3 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy +MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD +VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS +xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi +up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 +mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC +AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER +gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS +o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z +2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX +OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 2 +============================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE +ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT +DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn +2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 +BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx +JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e +uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 +jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia +78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm +V+GRMOrN +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +TDC Internet Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE +ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx +NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu +ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j +xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL +znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc +5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 +otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI +AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM +VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM +MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe +UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G +CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb +O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU +Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Firmaprofesional Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT +GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp +Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA +ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL +MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT +OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 +ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V +j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH +lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf +3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 +NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww +KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG +AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD +ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf +wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm +7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG +VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= +-----END CERTIFICATE----- + +Wells Fargo Root CA +=================== +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl +bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv +MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX +x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 +E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 +OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j +sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj +YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF +BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD +ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv +m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R +OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 +tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 +MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM +MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF +NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe +AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC +b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn +7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN +cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp +WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 +haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY +MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 +MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn +jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ +MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H +VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl +vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl +OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 +1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq +nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy +x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP +MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 +acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx +MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB +TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC +aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX +yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i +Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ +8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 +W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 +sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE +q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY +nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN +MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr +dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe +LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI +x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g +QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr +5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB +AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt +Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ +hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P +9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 +UrbnBEI= +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. +====================================== +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT +AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg +LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w +HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ +U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh +IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN +yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU +2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 +4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP +2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm +8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf +HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa +Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK +5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b +czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g +ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF +BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug +cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf +AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX +EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v +/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 +MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 +3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk +eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f +/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h +RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU +Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 2 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw +MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw +IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 +xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ +Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u +SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G +dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ +KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj +TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP +JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk +vQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 3 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw +MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W +yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo +6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ +uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk +2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE +O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 +yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 +IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal +092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc +5A== +-----END CERTIFICATE----- + +TC TrustCenter Universal CA I +============================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN +MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg +VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw +JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC +qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv +xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw +ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O +gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j +BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG +1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy +vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 +ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a +7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +ComSign Secured CA +================== +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE +AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w +NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD +QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs +49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH +7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB +kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 +9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw +AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t +U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA +j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC +AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a +BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp +FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP +51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +Buypass Class 3 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 +MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx +ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 +n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia +AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c +1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 +pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA +EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 +htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj +el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg +QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe +Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt +IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by +X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b +gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr +eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ +TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy +Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn +uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI +qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm +ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 +Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW +Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t +FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm +zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k +XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT +bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU +RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK +1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt +2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ +Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 +AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) FÅ‘tanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ +5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn +vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj +CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil +e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR +OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI +CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 +48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi +trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 +qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB +AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC +ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA +A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz ++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj +f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN +kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk +CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF +URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb +CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h +oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV +IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD +T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 +MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG +A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk +WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD +YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew +MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb +m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk +HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT +xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 +3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 +2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq +TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz +4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU +9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg +aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP +eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk +zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 +ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI +KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq +nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE +I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp +MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o +tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi +=================================================== +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz +ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 +MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 +cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u +aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY +8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y +jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI +JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk +9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG +SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d +F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq +D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 +Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +TC TrustCenter Universal CA III +=============================== +-----BEGIN CERTIFICATE----- +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe +Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU +QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex +KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt +QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO +juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut +CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 +M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G +A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA +g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ +KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK +BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq +woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +A-Trust-nQual-03 +================ +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE +Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy +a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R +dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw +RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 +ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 +c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA +zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n +yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE +SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 +iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V +cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV +eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 +ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr +sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd +JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 +ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Transport/fsockopen.php b/TeaSpeak/servers/teamspeak/lib/Requests/Transport/fsockopen.php new file mode 100644 index 0000000..21cb56d --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Transport/fsockopen.php @@ -0,0 +1,444 @@ +dispatch('fsockopen.before_request'); + + $url_parts = parse_url($url); + if (empty($url_parts)) { + throw new Requests_Exception('Invalid URL.', 'invalidurl', $url); + } + $host = $url_parts['host']; + $context = stream_context_create(); + $verifyname = false; + $case_insensitive_headers = new Requests_Utility_CaseInsensitiveDictionary($headers); + + // HTTPS support + if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') { + $remote_socket = 'ssl://' . $host; + if (!isset($url_parts['port'])) { + $url_parts['port'] = 443; + } + + $context_options = array( + 'verify_peer' => true, + // 'CN_match' => $host, + 'capture_peer_cert' => true + ); + $verifyname = true; + + // SNI, if enabled (OpenSSL >=0.9.8j) + if (defined('OPENSSL_TLSEXT_SERVER_NAME') && OPENSSL_TLSEXT_SERVER_NAME) { + $context_options['SNI_enabled'] = true; + if (isset($options['verifyname']) && $options['verifyname'] === false) { + $context_options['SNI_enabled'] = false; + } + } + + if (isset($options['verify'])) { + if ($options['verify'] === false) { + $context_options['verify_peer'] = false; + } + elseif (is_string($options['verify'])) { + $context_options['cafile'] = $options['verify']; + } + } + + if (isset($options['verifyname']) && $options['verifyname'] === false) { + $context_options['verify_peer_name'] = false; + $verifyname = false; + } + + stream_context_set_option($context, array('ssl' => $context_options)); + } + else { + $remote_socket = 'tcp://' . $host; + } + + $this->max_bytes = $options['max_bytes']; + + if (!isset($url_parts['port'])) { + $url_parts['port'] = 80; + } + $remote_socket .= ':' . $url_parts['port']; + + set_error_handler(array($this, 'connect_error_handler'), E_WARNING | E_NOTICE); + + $options['hooks']->dispatch('fsockopen.remote_socket', array(&$remote_socket)); + + $socket = stream_socket_client($remote_socket, $errno, $errstr, ceil($options['connect_timeout']), STREAM_CLIENT_CONNECT, $context); + + restore_error_handler(); + + if ($verifyname && !$this->verify_certificate_from_context($host, $context)) { + throw new Requests_Exception('SSL certificate did not match the requested domain name', 'ssl.no_match'); + } + + if (!$socket) { + if ($errno === 0) { + // Connection issue + throw new Requests_Exception(rtrim($this->connect_error), 'fsockopen.connect_error'); + } + + throw new Requests_Exception($errstr, 'fsockopenerror', null, $errno); + } + + $data_format = $options['data_format']; + + if ($data_format === 'query') { + $path = self::format_get($url_parts, $data); + $data = ''; + } + else { + $path = self::format_get($url_parts, array()); + } + + $options['hooks']->dispatch('fsockopen.remote_host_path', array(&$path, $url)); + + $request_body = ''; + $out = sprintf("%s %s HTTP/%.1f\r\n", $options['type'], $path, $options['protocol_version']); + + if ($options['type'] !== Requests::TRACE) { + if (is_array($data)) { + $request_body = http_build_query($data, null, '&'); + } + else { + $request_body = $data; + } + + if (!empty($data)) { + if (!isset($case_insensitive_headers['Content-Length'])) { + $headers['Content-Length'] = strlen($request_body); + } + + if (!isset($case_insensitive_headers['Content-Type'])) { + $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; + } + } + } + + if (!isset($case_insensitive_headers['Host'])) { + $out .= sprintf('Host: %s', $url_parts['host']); + + if (( 'http' === strtolower($url_parts['scheme']) && $url_parts['port'] !== 80 ) || ( 'https' === strtolower($url_parts['scheme']) && $url_parts['port'] !== 443 )) { + $out .= ':' . $url_parts['port']; + } + $out .= "\r\n"; + } + + if (!isset($case_insensitive_headers['User-Agent'])) { + $out .= sprintf("User-Agent: %s\r\n", $options['useragent']); + } + + $accept_encoding = $this->accept_encoding(); + if (!isset($case_insensitive_headers['Accept-Encoding']) && !empty($accept_encoding)) { + $out .= sprintf("Accept-Encoding: %s\r\n", $accept_encoding); + } + + $headers = Requests::flatten($headers); + + if (!empty($headers)) { + $out .= implode($headers, "\r\n") . "\r\n"; + } + + $options['hooks']->dispatch('fsockopen.after_headers', array(&$out)); + + if (substr($out, -2) !== "\r\n") { + $out .= "\r\n"; + } + + if (!isset($case_insensitive_headers['Connection'])) { + $out .= "Connection: Close\r\n"; + } + + $out .= "\r\n" . $request_body; + + $options['hooks']->dispatch('fsockopen.before_send', array(&$out)); + + fwrite($socket, $out); + $options['hooks']->dispatch('fsockopen.after_send', array($out)); + + if (!$options['blocking']) { + fclose($socket); + $fake_headers = ''; + $options['hooks']->dispatch('fsockopen.after_request', array(&$fake_headers)); + return ''; + } + + $timeout_sec = (int) floor($options['timeout']); + if ($timeout_sec == $options['timeout']) { + $timeout_msec = 0; + } + else { + $timeout_msec = self::SECOND_IN_MICROSECONDS * $options['timeout'] % self::SECOND_IN_MICROSECONDS; + } + stream_set_timeout($socket, $timeout_sec, $timeout_msec); + + $response = $body = $headers = ''; + $this->info = stream_get_meta_data($socket); + $size = 0; + $doingbody = false; + $download = false; + if ($options['filename']) { + $download = fopen($options['filename'], 'wb'); + } + + while (!feof($socket)) { + $this->info = stream_get_meta_data($socket); + if ($this->info['timed_out']) { + throw new Requests_Exception('fsocket timed out', 'timeout'); + } + + $block = fread($socket, Requests::BUFFER_SIZE); + if (!$doingbody) { + $response .= $block; + if (strpos($response, "\r\n\r\n")) { + list($headers, $block) = explode("\r\n\r\n", $response, 2); + $doingbody = true; + } + } + + // Are we in body mode now? + if ($doingbody) { + $options['hooks']->dispatch('request.progress', array($block, $size, $this->max_bytes)); + $data_length = strlen($block); + if ($this->max_bytes) { + // Have we already hit a limit? + if ($size === $this->max_bytes) { + continue; + } + if (($size + $data_length) > $this->max_bytes) { + // Limit the length + $limited_length = ($this->max_bytes - $size); + $block = substr($block, 0, $limited_length); + } + } + + $size += strlen($block); + if ($download) { + fwrite($download, $block); + } + else { + $body .= $block; + } + } + } + $this->headers = $headers; + + if ($download) { + fclose($download); + } + else { + $this->headers .= "\r\n\r\n" . $body; + } + fclose($socket); + + $options['hooks']->dispatch('fsockopen.after_request', array(&$this->headers, &$this->info)); + return $this->headers; + } + + /** + * Send multiple requests simultaneously + * + * @param array $requests Request data (array of 'url', 'headers', 'data', 'options') as per {@see Requests_Transport::request} + * @param array $options Global options, see {@see Requests::response()} for documentation + * @return array Array of Requests_Response objects (may contain Requests_Exception or string responses as well) + */ + public function request_multiple($requests, $options) { + $responses = array(); + $class = get_class($this); + foreach ($requests as $id => $request) { + try { + $handler = new $class(); + $responses[$id] = $handler->request($request['url'], $request['headers'], $request['data'], $request['options']); + + $request['options']['hooks']->dispatch('transport.internal.parse_response', array(&$responses[$id], $request)); + } + catch (Requests_Exception $e) { + $responses[$id] = $e; + } + + if (!is_string($responses[$id])) { + $request['options']['hooks']->dispatch('multiple.request.complete', array(&$responses[$id], $id)); + } + } + + return $responses; + } + + /** + * Retrieve the encodings we can accept + * + * @return string Accept-Encoding header value + */ + protected static function accept_encoding() { + $type = array(); + if (function_exists('gzinflate')) { + $type[] = 'deflate;q=1.0'; + } + + if (function_exists('gzuncompress')) { + $type[] = 'compress;q=0.5'; + } + + $type[] = 'gzip;q=0.5'; + + return implode(', ', $type); + } + + /** + * Format a URL given GET data + * + * @param array $url_parts + * @param array|object $data Data to build query using, see {@see https://secure.php.net/http_build_query} + * @return string URL with data + */ + protected static function format_get($url_parts, $data) { + if (!empty($data)) { + if (empty($url_parts['query'])) { + $url_parts['query'] = ''; + } + + $url_parts['query'] .= '&' . http_build_query($data, null, '&'); + $url_parts['query'] = trim($url_parts['query'], '&'); + } + if (isset($url_parts['path'])) { + if (isset($url_parts['query'])) { + $get = $url_parts['path'] . '?' . $url_parts['query']; + } + else { + $get = $url_parts['path']; + } + } + else { + $get = '/'; + } + return $get; + } + + /** + * Error handler for stream_socket_client() + * + * @param int $errno Error number (e.g. E_WARNING) + * @param string $errstr Error message + */ + public function connect_error_handler($errno, $errstr) { + // Double-check we can handle it + if (($errno & E_WARNING) === 0 && ($errno & E_NOTICE) === 0) { + // Return false to indicate the default error handler should engage + return false; + } + + $this->connect_error .= $errstr . "\n"; + return true; + } + + /** + * Verify the certificate against common name and subject alternative names + * + * Unfortunately, PHP doesn't check the certificate against the alternative + * names, leading things like 'https://www.github.com/' to be invalid. + * Instead + * + * @see https://tools.ietf.org/html/rfc2818#section-3.1 RFC2818, Section 3.1 + * + * @throws Requests_Exception On failure to connect via TLS (`fsockopen.ssl.connect_error`) + * @throws Requests_Exception On not obtaining a match for the host (`fsockopen.ssl.no_match`) + * @param string $host Host name to verify against + * @param resource $context Stream context + * @return bool + */ + public function verify_certificate_from_context($host, $context) { + $meta = stream_context_get_options($context); + + // If we don't have SSL options, then we couldn't make the connection at + // all + if (empty($meta) || empty($meta['ssl']) || empty($meta['ssl']['peer_certificate'])) { + throw new Requests_Exception(rtrim($this->connect_error), 'ssl.connect_error'); + } + + $cert = openssl_x509_parse($meta['ssl']['peer_certificate']); + + return Requests_SSL::verify_certificate($host, $cert); + } + + /** + * Whether this transport is valid + * + * @codeCoverageIgnore + * @return boolean True if the transport is valid, false otherwise. + */ + public static function test($capabilities = array()) { + if (!function_exists('fsockopen')) { + return false; + } + + // If needed, check that streams support SSL + if (isset($capabilities['ssl']) && $capabilities['ssl']) { + if (!extension_loaded('openssl') || !function_exists('openssl_x509_parse')) { + return false; + } + + // Currently broken, thanks to https://github.com/facebook/hhvm/issues/2156 + if (defined('HHVM_VERSION')) { + return false; + } + } + + return true; + } +} diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Utility/CaseInsensitiveDictionary.php b/TeaSpeak/servers/teamspeak/lib/Requests/Utility/CaseInsensitiveDictionary.php new file mode 100644 index 0000000..2c97893 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Utility/CaseInsensitiveDictionary.php @@ -0,0 +1,103 @@ + $value) { + $this->offsetSet($key, $value); + } + } + + /** + * Check if the given item exists + * + * @param string $key Item key + * @return boolean Does the item exist? + */ + public function offsetExists($key) { + $key = strtolower($key); + return isset($this->data[$key]); + } + + /** + * Get the value for the item + * + * @param string $key Item key + * @return string Item value + */ + public function offsetGet($key) { + $key = strtolower($key); + if (!isset($this->data[$key])) { + return null; + } + + return $this->data[$key]; + } + + /** + * Set the given item + * + * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`) + * + * @param string $key Item name + * @param string $value Item value + */ + public function offsetSet($key, $value) { + if ($key === null) { + throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset'); + } + + $key = strtolower($key); + $this->data[$key] = $value; + } + + /** + * Unset the given header + * + * @param string $key + */ + public function offsetUnset($key) { + unset($this->data[strtolower($key)]); + } + + /** + * Get an iterator for the data + * + * @return ArrayIterator + */ + public function getIterator() { + return new ArrayIterator($this->data); + } + + /** + * Get the headers as an array + * + * @return array Header data + */ + public function getAll() { + return $this->data; + } +} diff --git a/TeaSpeak/servers/teamspeak/lib/Requests/Utility/FilteredIterator.php b/TeaSpeak/servers/teamspeak/lib/Requests/Utility/FilteredIterator.php new file mode 100644 index 0000000..76a29e7 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/Requests/Utility/FilteredIterator.php @@ -0,0 +1,45 @@ +callback = $callback; + } + + /** + * Get the current item's value after filtering + * + * @return string + */ + public function current() { + $value = parent::current(); + $value = call_user_func($this->callback, $value); + return $value; + } +} diff --git a/TeaSpeak/servers/teamspeak/lib/TSDNS.php b/TeaSpeak/servers/teamspeak/lib/TSDNS.php new file mode 100644 index 0000000..796155b --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/TSDNS.php @@ -0,0 +1,41 @@ +url = $url; + $this->apiKey = $apiKey; + } + + function getZones() { + $command = '/list'; + return $this->sendRequest($command); + } + + function addZone($zone, $target) { + $command = '/add/' . $zone . '/' . $target; + return $this->sendRequest($command); + } + + function deleteZone($zone) { + $command = '/del/' . $zone; + return $this->sendRequest($command); + } + + function getZone($zone) { + $command = '/get/' . $zone; + return $this->sendRequest($command); + } + + function sendRequest($command) { + $url = $this->url . $command; + $headers = array('Accept' => 'application/json', 'Authorization' => $this->apiKey); + Requests::register_autoloader(); + $request = Requests::get($url, $headers); + return $request; + } + +} diff --git a/TeaSpeak/servers/teamspeak/lib/TeamSpeak.php b/TeaSpeak/servers/teamspeak/lib/TeamSpeak.php new file mode 100644 index 0000000..ab4cd11 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/lib/TeamSpeak.php @@ -0,0 +1,4752 @@ +. + */ +/** + * @file + * The ts3admin.class is a powerful api for communication with Teamspeak 3 Servers from your website! Your creativity knows no bounds! + * + * @author Stefan Zehnpfennig + * @copyright Copyright (c) 2016, Stefan Zehnpfennig + * @version 1.0.1.8 + * @package ts3admin + * + */ + +/** + * \class ts3admin + * \brief The ts3admin.class + */ +class TeamSpeak { +//******************************************************************************************* +//****************************************** Vars ******************************************* +//******************************************************************************************* + + /** + * runtime is an private handle and configuration storage + * + * @author Stefan Zehnpfennig + */ + private $runtime = array('socket' => '', 'selected' => false, 'host' => '', 'queryport' => '10011', 'timeout' => 2, 'debug' => array(), 'fileSocket' => '', 'bot_clid' => '', 'bot_name' => ''); + +//******************************************************************************************* +//*************************************** Constants ***************************************** +//******************************************************************************************* + + const HostMessageMode_NONE = 0; + const HostMessageMode_LOG = 1; + const HostMessageMode_MODAL = 2; + const HostMessageMode_MODALQUIT = 3; + + const HostBannerMode_NOADJUST = 0; + const HostBannerMode_IGNOREASPECT = 1; + const HostBannerMode_KEEPASPECT = 2; + + const CODEC_SPEEX_NARROWBAND = 0; + const CODEC_SPEEX_WIDEBAND = 1; + const CODEC_SPEEX_ULTRAWIDEBAND = 2; + const CODEC_CELT_MONO = 3; + const CODEC_OPUS_VOICE = 4; + const CODEC_OPUS_MUSIC = 5; + + const CODEC_CRYPT_INDIVIDUAL = 0; + const CODEC_CRYPT_DISABLED = 1; + const CODEC_CRYPT_ENABLED = 2; + + const TextMessageTarget_CLIENT = 1; + const TextMessageTarget_CHANNEL = 2; + const TextMessageTarget_SERVER = 3; + + const LogLevel_ERROR = 1; + const LogLevel_WARNING = 2; + const LogLevel_DEBUG = 3; + const LogLevel_INFO = 4; + + const REASON_KICK_CHANNEL = 4; + const REASON_KICK_SERVER = 5; + + const PermGroupDBTypeTemplate = 0; + const PermGroupDBTypeRegular = 1; + const PermGroupDBTypeQuery = 2; + + const PermGroupTypeServerGroup = 0; + const PermGroupTypeGlobalClient = 1; + const PermGroupTypeChannel = 2; + const PermGroupTypeChannelGroup = 3; + const PermGroupTypeChannelClient = 4; + + const TokenServerGroup = 0; + const TokenChannelGroup = 1; + +//******************************************************************************************* +//************************************ Public Functions ************************************* +//****************************************************************************************** + + /** + * banAddByIp + * + * Adds a new ban rule on the selected virtual server. + * + * Output: + *
+     * Array
+     * {
+     *  [banid] => 109
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $ip clientIp + * @param integer $time bantime in seconds (0=unlimited/default) [optional] + * @param string $banreason Banreason [optional] + * @return array banId + */ + function banAddByIp($ip, $time = 0, $banreason = NULL) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(!empty($banreason)) { $msg = ' banreason='.$this->escapeText($banreason); } else { $msg = NULL; } + + return $this->getData('array', 'banadd ip='.$ip.' time='.$time.$msg); + } + + /** + * banAddByUid + * + * Adds a new ban rule on the selected virtual server. + * + * Output: + *
+     * Array
+     * {
+     *  [banid] => 110
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $uid clientUniqueId + * @param integer $time bantime in seconds (0=unlimited/default) [optional] + * @param string $banreason Banreason [optional] + * @return array banId + */ + function banAddByUid($uid, $time = 0, $banreason = NULL) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(!empty($banreason)) { $msg = ' banreason='.$this->escapeText($banreason); } else { $msg = NULL; } + + return $this->getData('array', 'banadd uid='.$uid.' time='.$time.$msg); + } + + /** + * banAddByName + * + * Adds a new ban rule on the selected virtual server. + * + * Output: + *
+     * Array
+     * {
+     *  [banid] => 111
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $name clientName + * @param integer $time bantime in seconds (0=unlimited/default) [optional] + * @param string $banreason Banreason [optional] + * @return array banId + */ + function banAddByName($name, $time = 0, $banreason = NULL) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(!empty($banreason)) { $msg = ' banreason='.$this->escapeText($banreason); } else { $msg = NULL; } + + return $this->getData('array', 'banadd name='.$this->escapeText($name).' time='.$time.$msg); + } + + /** + * banClient + * + * Bans the client specified with ID clid from the server. Please note that this will create two separate ban rules for the targeted clients IP address and his unique identifier. + * + * Output: + *
+     * Array
+     * {
+     *  [1] => 129
+     *  [2] => 130
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $clid clientId + * @param integer $time bantime in seconds (0=unlimited/default) [optional] + * @param string $banreason Banreason [optional] + * @return array banIds + */ + function banClient($clid, $time = 0, $banreason = NULL) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(!empty($banreason)) { $msg = ' banreason='.$this->escapeText($banreason); } else { $msg = ''; } + + $result = $this->getData('plain', 'banclient clid='.$clid.' time='.$time.$msg); + + if($result['success']) { + return $this->generateOutput(true, $result['errors'], $this->splitBanIds($result['data'])); + }else{ + return $this->generateOutput(false, $result['errors'], false); + } + } + + /** + * banDelete + * + * Deletes the ban rule with ID banid from the server. + * + * @author Stefan Zehnpfennig + * @param integer $banID banID + * @return boolean success + */ + function banDelete($banID) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'bandel banid='.$banID); + } + + /** + * banDeleteAll + * + * Deletes all active ban rules from the server. + * + * @author Stefan Zehnpfennig + * @return boolean success + */ + function banDeleteAll() { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'bandelall'); + } + + /** + * banList + * + * Displays a list of active bans on the selected virtual server. + * + * Output: + *
+     * Array
+     * {
+     *  [banid] => 131
+     *  [ip] => 1.2.3.4
+     *  [name] => eugen
+     *  [uid] => IYAntAcZHgVC7s3n3DNWmuJB/aM=
+     *  [created] => 1286660391
+     *  [duration] => 0
+     *  [invokername] => Par0noid
+     *  [invokercldbid] => 2086
+     *  [invokeruid] => nUixbsq/XakrrmbqU8O30R/D8Gc=
+     *  [reason] => insult
+     *  [enforcements] => 0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array banlist + */ + function banList() { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'banlist'); + } + + /** + * bindingList + * + * Displays a list of IP addresses used by the server instance on multi-homed machines. + * + * Output: + *
+     * Array
+     * {
+     *  [ip] => 0.0.0.0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $subsystem (1: voice, 2: query, 3: filetransfer) + * @return array bindingList + */ + function bindingList($subsystem = 0) { + return $this->getData('multi', 'bindinglist'.($subsystem == 1 ? ' subsystem=voice' : '').($subsystem == 2 ? ' subsystem=query' : '').($subsystem == 3 ? ' subsystem=filetransfer' : '')); + } + + /** + * channelAddPerm + * + * Adds a set of specified permissions to a channel. Multiple permissions can be added by providing the two parameters of each permission. A permission can be specified by permid or permsid. + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions['permissionID'] = 'permissionValue';
+     * //or you could use Permission Name
+     * $permissions['permissionName'] = 'permissionValue';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cid channelId + * @param array $permissions permissions + * @return boolean success + */ + function channelAddPerm($cid, $permissions) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(count($permissions) > 0) { + //Permissions given + + //Errorcollector + $errors = array(); + + //Split Permissions to prevent query from overload + $permissions = array_chunk($permissions, 50, true); + + //Action for each splitted part of permission + foreach($permissions as $permission_part) + { + //Create command_string for each command that we could use implode later + $command_string = array(); + + foreach($permission_part as $key => $value) + { + $command_string[] = (is_numeric($key) ? "permid=" : "permsid=").$this->escapeText($key).' permvalue='.$value; + } + + $result = $this->getData('boolean', 'channeladdperm cid='.$cid.' '.implode('|', $command_string)); + + if(!$result['success']) + { + foreach($result['errors'] as $error) + { + $errors[] = $error; + } + } + } + + if(count($errors) == 0) + { + return $this->generateOutput(true, array(), true); + }else{ + return $this->generateOutput(false, $errors, false); + } + + }else{ + // No permissions given + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + } + + /** + * channelClientAddPerm + * + * Adds a set of specified permissions to a client in a specific channel. Multiple permissions can be added by providing the three parameters of each permission. A permission can be specified by permid or permsid. + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions['permissionID'] = 'permissionValue';
+     * //or you could use Permission Name
+     * $permissions['permissionName'] = 'permissionValue';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cid channelID + * @param integer $cldbid clientDBID + * @param array $permissions permissions + * @return boolean success + */ + function channelClientAddPerm($cid, $cldbid, $permissions) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(count($permissions) > 0) { + //Permissions given + + //Errorcollector + $errors = array(); + + //Split Permissions to prevent query from overload + $permissions = array_chunk($permissions, 50, true); + + //Action for each splitted part of permission + foreach($permissions as $permission_part) + { + //Create command_string for each command that we could use implode later + $command_string = array(); + + foreach($permission_part as $key => $value) + { + $command_string[] = (is_numeric($key) ? "permid=" : "permsid=").$this->escapeText($key).' permvalue='.$value; + } + + $result = $this->getData('boolean', 'channelclientaddperm cid='.$cid.' cldbid='.$cldbid.' '.implode('|', $command_string)); + + if(!$result['success']) + { + foreach($result['errors'] as $error) + { + $errors[] = $error; + } + } + } + + if(count($errors) == 0) + { + return $this->generateOutput(true, array(), true); + }else{ + return $this->generateOutput(false, $errors, false); + } + + }else{ + // No permissions given + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + } + + /** + * channelClientDelPerm + * + * Removes a set of specified permissions from a client in a specific channel. Multiple permissions can be removed at once. A permission can be specified by permid or permsid. + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions[] = 'permissionID';
+     * $permissions[] = 'permissionName';
+     * //or
+     * $permissions = array('permissionID', 'permissionName', 'permissionID');
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cid channelID + * @param integer $cldbid clientDBID + * @param array $permissions permissions + * @return boolean success + */ + function channelClientDelPerm($cid, $cldbid, $permissions) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + $permissionArray = array(); + + if(count($permissions) > 0) { + foreach($permissions AS $value) { + $permissionArray[] = is_numeric($value) ? 'permid='.$value : 'permsid='.$value; + } + return $this->getData('boolean', 'channelclientdelperm cid='.$cid.' cldbid='.$cldbid.' '.implode('|', $permissionArray)); + }else{ + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + } + + /** + * channelClientPermList + * + * Displays a list of permissions defined for a client in a specific channel. + * + * Output: + *
+     * Array
+     * {
+     *  [cid] => 250 (only in first result)
+     *  [cldbid] => 2086 (only in first result)
+     *  [permid] => 12876 (if permsid = false)
+     *  [permsid] => b_client_info_view (if permsid = true)
+     *  [permvalue] => 1
+     *  [permnegated] => 0
+     *  [permskip] => 0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cid channelID + * @param integer $cldbid clientDBID + * @param boolean $permsid displays permissionName instead of permissionID + * @return array channelclientpermlist + */ + function channelClientPermList($cid, $cldbid, $permsid = false) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'channelclientpermlist cid='.$cid.' cldbid='.$cldbid.($permsid ? ' -permsid' : '')); + } + + /** + * channelCreate + * + * Creates a new channel using the given properties and displays its ID. Note that this command accepts multiple properties which means that you're able to specifiy all settings of the new channel at once. + * + * Hint: don't forget to set channel_flag_semi_permanent = 1 or channel_flag_permanent = 1 + * + * Hint: you'll get an error if you want to create a channel without channel_name + * + * Hint: to set the parent channel you've to use cpid instead of pid + * + * Input-Array like this: + *
+     * $data = array();
+     *
+     * $data['setting'] = 'value';
+     * $data['setting'] = 'value';
+     * 
+ * + * Output: + *
+     * Array
+     * {
+     *  [cid] => 257
+     * }
+     * 
+ * + * Possible properties: CHANNEL_NAME, CHANNEL_TOPIC, CHANNEL_DESCRIPTION, CHANNEL_PASSWORD, CHANNEL_CODEC, CHANNEL_CODEC_QUALITY, CHANNEL_MAXCLIENTS, CHANNEL_MAXFAMILYCLIENTS, CHANNEL_ORDER, CHANNEL_FLAG_PERMANENT, CHANNEL_FLAG_SEMI_PERMANENT, CHANNEL_FLAG_TEMPORARY, CHANNEL_FLAG_DEFAULT, CHANNEL_FLAG_MAXCLIENTS_UNLIMITED, CHANNEL_FLAG_MAXFAMILYCLIENTS_UNLIMITED, CHANNEL_FLAG_MAXFAMILYCLIENTS_INHERITED, CHANNEL_NEEDED_TALK_POWER, CHANNEL_NAME_PHONETIC, CHANNEL_ICON_ID, CHANNEL_CODEC_IS_UNENCRYPTED, CPID + * + * @author Stefan Zehnpfennig + * @param array $data properties + * @return array channelInfo + */ + function channelCreate($data) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + $propertiesString = ''; + + foreach($data as $key => $value) { + $propertiesString .= ' '.strtolower($key).'='.$this->escapeText($value); + } + + return $this->getData('array', 'channelcreate '.$propertiesString); + } + + /** + * channelDelete + * + * Deletes an existing channel by ID. If force is set to 1, the channel will be deleted even if there are clients within. The clients will be kicked to the default channel with an appropriate reason message. + * + * @author Stefan Zehnpfennig + * @param integer $cid channelID + * @param integer $force {1|0} (default: 1) + * @return boolean success + */ + function channelDelete($cid, $force = 1) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'channeldelete cid='.$cid.' force='.$force); + } + + /** + * channelDelPerm + * + * Removes a set of specified permissions from a channel. Multiple permissions can be removed at once. A permission can be specified by permid or permsid. + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions[] = 'permissionID';
+     * //or you could use
+     * $permissions[] = 'permissionName';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cid channelID + * @param array $permissions permissions + * @return boolean success + */ + function channelDelPerm($cid, $permissions) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + $permissionArray = array(); + + if(count($permissions) > 0) { + foreach($permissions AS $value) { + $permissionArray[] = (is_numeric($value) ? 'permid=' : 'permsid=').$value; + } + return $this->getData('boolean', 'channeldelperm cid='.$cid.' '.implode('|', $permissionArray)); + }else{ + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + } + + /** + * channelEdit + * + * Changes a channels configuration using given properties. Note that this command accepts multiple properties which means that you're able to change all settings of the channel specified with cid at once. + * + * Input-Array like this: +
+    $data = array();
+
+    $data['setting'] = 'value';
+    $data['setting'] = 'value';
+    
+ * + * Possible properties: Take a look at channelCreate function + * + * @author Stefan Zehnpfennig + * @param integer $cid $channelID + * @param array $data edited settings + * @return boolean success + */ + function channelEdit($cid, $data) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + $settingsString = ''; + + foreach($data as $key => $value) { + $settingsString .= ' '.strtolower($key).'='.$this->escapeText($value); + } + + return $this->getData('boolean', 'channeledit cid='.$cid.$settingsString); + } + + /** + * channelFind + * + * displays a list of channels matching a given name pattern. + * + * Output: + *
+     * Array
+     * {
+     *  [cid] => 2
+     *  [channel_name] => Lobby
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $pattern channelName + * @return array channelList + */ + function channelFind($pattern) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'channelfind pattern='.$this->escapeText($pattern)); + } + + + /** + * channelGetIconByID + * + * Will return the base64 encoded binary of the channelIcon + * + *
+     * $result = $tsAdmin->channelGetIconByID($iconId);
+     * You can display it like: echo '';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $iconID channelIconID + * @return array base64 image + */ + function channelGetIconByID($iconID) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(empty($iconID)) + { + return $this->generateOutput(false, array('Error: empty iconID'), false); + } + + if($iconID < 0) + { + $iconID = sprintf('%u', $iconID & 0xffffffff); + } + + $check = $this->ftgetfileinfo(0, '', '/icon_'.$iconID); + + if(!$check["success"]) + { + return $this->generateOutput(false, array('Error: icon does not exist'), false); + } + + $init = $this->ftInitDownload('/icon_'.$iconID, 0, ''); + + if(!$init["success"]) + { + return $this->generateOutput(false, array('Error: init failed'), false); + } + + $download = $this->ftDownloadFile($init); + + if(is_array($download)) + { + return $download; + }else{ + return $this->generateOutput(true, false, base64_encode($download)); + } + } + + /** + * channelGetIconByChannelID + * + * Will return the base64 encoded binary of the channelIcon + * + *
+     * $result = $tsAdmin->channelGetIconByChannelID($channelID);
+     * You can display it like: echo '';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $channelID channelID + * @return array base64 image + */ + function channelGetIconByChannelID($channelID) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(empty($channelID)) + { + return $this->generateOutput(false, array('Error: empty channelID'), false); + } + + $channel = $this->channelInfo($channelID); + + if(!$channel["success"]) + { + return $this->generateOutput(false, $channel["error"], false); + } + + $icon_id = $channel["data"]["channel_icon_id"]; + + if($icon_id != 100 AND $icon_id != 200 AND $icon_id != 300 AND $icon_id != 500 AND $icon_id != 600 AND $icon_id != 0) + { + if($icon_id < 0) + { + $icon_id = sprintf('%u', $icon_id & 0xffffffff); + } + } + else + { + return $this->generateOutput(false, "invalid channel icon", false); + } + + $check = $this->ftgetfileinfo(0, '', '/icon_'.$icon_id); + + if(!$check["success"]) + { + return $this->generateOutput(false, array('Error: icon does not exist'), false); + } + + $init = $this->ftInitDownload('/icon_'.$icon_id, 0, ''); + + if(!$init["success"]) + { + return $this->generateOutput(false, array('Error: init failed'), false); + } + + $download = $this->ftDownloadFile($init); + + if(is_array($download)) + { + return $download; + }else{ + return $this->generateOutput(true, false, base64_encode($download)); + } + } + + /** + * channelGroupAdd + * + * Creates a new channel group using a given name and displays its ID. The optional type parameter can be used to create ServerQuery groups and template groups. + * + * groupDbTypes: + *
    + *
  1. template group (used for new virtual servers)
  2. + *
  3. regular group (used for regular clients)
  4. + *
  5. global query group (used for ServerQuery clients)
  6. + *
+ * + * Output: + *
+     * Array
+     * {
+     *  [cgid] => 86
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $name groupName + * @param integer $type groupDbType [optional] (default: 1) + * @return boolean success + */ + function channelGroupAdd($name, $type = 1) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'channelgroupadd name='.$this->escapeText($name).' type='.$type); + } + + /** + * channelGroupAddPerm + * + * Adds a set of specified permissions to a channel group. Multiple permissions can be added by providing the two parameters of each permission. A permission can be specified by permid or permsid. + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions['permissionID'] = 'permissionValue';
+     * //or you could use:
+     * $permissions['permissionName'] = 'permissionValue';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cgid channelGroupID + * @param array $permissions permissions + * @return boolean success + */ + function channelGroupAddPerm($cgid, $permissions) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(count($permissions) > 0) { + //Permissions given + + //Errorcollector + $errors = array(); + + //Split Permissions to prevent query from overload + $permissions = array_chunk($permissions, 50, true); + + //Action for each splitted part of permission + foreach($permissions as $permission_part) + { + //Create command_string for each command that we could use implode later + $command_string = array(); + + foreach($permission_part as $key => $value) + { + $command_string[] = (is_numeric($key) ? "permid=" : "permsid=").$this->escapeText($key).' permvalue='.$value; + } + + $result = $this->getData('boolean', 'channelgroupaddperm cgid='.$cgid.' '.implode('|', $command_string)); + + if(!$result['success']) + { + foreach($result['errors'] as $error) + { + $errors[] = $error; + } + } + } + + if(count($errors) == 0) { + return $this->generateOutput(true, array(), true); + }else{ + return $this->generateOutput(false, $errors, false); + } + + }else{ + // No permissions given + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + } + + /** + * channelGroupClientList + * + * Displays all the client and/or channel IDs currently assigned to channel groups. All three parameters are optional so you're free to choose the most suitable combination for your requirement + * + * Output: + *
+     * Array
+     * {
+     *  [cid] => 2
+     *  [cldbid] => 9
+     *  [cgid] => 9
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cid channelID [optional] + * @param integer $cldbid clientDBID [optional] + * @param integer $cgid channelGroupID [optional] + * @return array channelGroupClientList + */ + function channelGroupClientList($cid = NULL, $cldbid = NULL, $cgid = NULL) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + return $this->getData('multi', 'channelgroupclientlist'.(!empty($cid) ? ' cid='.$cid : '').(!empty($cldbid) ? ' cldbid='.$cldbid : '').(!empty($cgid) ? ' cgid='.$cgid : '')); + } + + /** + * channelGroupCopy + * + * Creates a copy of the channel group specified with scgid. If tcgid is set to 0, the server will create a new group. To overwrite an existing group, simply set tcgid to the ID of a designated target group. If a target group is set, the name parameter will be ignored. The type parameter can be used to create ServerQuery groups and template groups. + * + * groupDbTypes: + *
    + *
  1. template group (used for new virtual servers)
  2. + *
  3. regular group (used for regular clients)
  4. + *
  5. global query group (used for ServerQuery clients)
  6. + *
+ * + * Output: + *
+     * Array
+     * {
+     *  [cgid] => 86
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $scgid sourceChannelGroupID + * @param integer $tcgid targetChannelGroupID + * @param integer $name groupName + * @param integer $type groupDbType + * @return array groupId + */ + function channelGroupCopy($scgid, $tcgid, $name, $type = 1) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'channelgroupcopy scgid='.$scgid.' tcgid='.$tcgid.' name='.$this->escapeText($name).' type='.$type); + } + + /** + * channelGroupDelete + * + * Deletes a channel group by ID. If force is set to 1, the channel group will be deleted even if there are clients within. + * + * @author Stefan Zehnpfennig + * @param integer $cgid channelGroupID + * @param integer $force forces deleting channelGroup (default: 1) + * @return boolean success + */ + function channelGroupDelete($cgid, $force = 1) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'channelgroupdel cgid='.$cgid.' force='.$force); + } + + /** + * channelGroupDelPerm + * + * Removes a set of specified permissions from the channel group. Multiple permissions can be removed at once. A permission can be specified by permid or permsid. + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions[] = 'permissionID';
+     * $permissions[] = 'permissionName';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cgid channelGroupID + * @param array $permissions permissions + * @return boolean success + */ + function channelGroupDelPerm($cgid, $permissions) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + $permissionArray = array(); + + if(count($permissions) > 0) { + foreach($permissions AS $value) { + $permissionArray[] = (is_numeric($value) ? 'permid=' : 'permsid=').$value; + } + return $this->getData('boolean', 'channelgroupdelperm cgid='.$cgid.' '.implode('|', $permissionArray)); + }else{ + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + } + + /** + * channelGroupList + * + * Displays a list of channel groups available on the selected virtual server. + * + * Output: + *
+     * Array
+     * {
+     *  [cgid] => 3
+     *  [name] => Testname
+     *  [type] => 0
+     *  [iconid] => 100
+     *  [savedb] => 1
+     *  [sortid] => 0
+     *  [namemode] => 0
+     *  [n_modifyp] => 75
+     *  [n_member_addp] => 50
+     *  [n_member_removep] => 50
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array channelGroupList + */ + function channelGroupList() { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + return $this->getData('multi', 'channelgrouplist'); + } + + /** + * channelGroupPermList + * + * Displays a list of permissions assigned to the channel group specified with cgid. + * If the permsid option is specified, the output will contain the permission names instead of the internal IDs. + * + * Output: + *
+     * Array
+     * {
+     *  [permid] => 8471 (displayed if permsid is false)
+     *  [permsid] => i_channel_create_modify_with_codec_latency_factor_min (displayed if permsid is true)
+     *  [permvalue] => 1
+     *  [permnegated] => 0
+     *  [permskip] => 0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cgid channelGroupID + * @param boolean $permsid permsid + * @return array channelGroupPermlist + */ + function channelGroupPermList($cgid, $permsid = false) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'channelgrouppermlist cgid='.$cgid.($permsid ? ' -permsid' : '')); + } + + /** + * channelGroupRename + * + * Changes the name of a specified channel group. + * + * @author Stefan Zehnpfennig + * @param integer $cgid groupID + * @param integer $name groupName + * @return boolean success + */ + function channelGroupRename($cgid, $name) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'channelgrouprename cgid='.$cgid.' name='.$this->escapeText($name)); + } + + /** + * channelInfo + * + * Displays detailed configuration information about a channel including ID, topic, description, etc. + + * Output: + *
+     * Array
+     * {
+     *  [pid] => 0
+     *  [channel_name] => Test
+     *  [channel_topic] =>
+     *  [channel_description] =>
+     *  [channel_password] => cc97Pm4oOYq0J9fXDAgiWv/qScQ=
+     *  [channel_codec] => 2
+     *  [channel_codec_quality] => 7
+     *  [channel_maxclients] => -1
+     *  [channel_maxfamilyclients] => -1
+     *  [channel_order] => 1
+     *  [channel_flag_permanent] => 1
+     *  [channel_flag_semi_permanent] => 0
+     *  [channel_flag_default] => 0
+     *  [channel_flag_password] => 0
+     *  [channel_codec_latency_factor] => 1
+     *  [channel_codec_is_unencrypted] => 1
+     *	 [channel_security_salt] =>
+     *  [channel_delete_delay] => 0
+     *  [channel_flag_maxclients_unlimited] => 1
+     *  [channel_flag_maxfamilyclients_unlimited] => 0
+     *  [channel_flag_maxfamilyclients_inherited] => 1
+     *  [channel_filepath] => files\\virtualserver_1\\channel_2
+     *  [channel_needed_talk_power] => 0
+     *  [channel_forced_silence] => 0
+     *  [channel_name_phonetic] =>
+     *  [channel_icon_id] => 0
+     *	 [channel_flag_private] => 0
+     *  [seconds_empty] => 61 (If it's a temporary channel with a channel delete delay)
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cid channelID + * @return array channelInfo + */ + function channelInfo($cid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'channelinfo cid='.$cid); + } + + /** + * channelList + * + * Displays a list of channels created on a virtual server including their ID, order, name, etc. The output can be modified using several command options. + * + * Possible parameters: [-topic] [-flags] [-voice] [-limits] [-icon] [-seconds_empty] + * + * Output: (without parameters) + *
+     * Array
+     * {
+     *  [cid] => 2
+     *  [pid] => 0
+     *  [channel_order] => 1
+     *  [channel_name] => Test
+     *  [total_clients] => 0
+     *  [channel_needed_subscribe_power] => 0
+     * }
+     * 
+ * Output: (from parameters) + *
+     * Array
+     * {
+     *  [-topic] => [channel_topic] => Default Channel has no topic
+     *  [-flags] => [channel_flag_default] => 1
+     *  [-flags] => [channel_flag_password] => 0
+     *  [-flags] => [channel_flag_permanent] => 1
+     *  [-flags] => [channel_flag_semi_permanent] => 0
+     *  [-voice] => [channel_codec] => 2
+     *  [-voice] => [channel_codec_quality] => 7
+     *  [-voice] => [channel_needed_talk_power] => 0
+     *  [-limits] => [total_clients_family] => 1
+     *  [-limits] => [channel_maxclients] => -1
+     *  [-limits] => [channel_maxfamilyclients] => -1
+     *  [-icon] => [channel_icon_id] => 0
+     *  [-seconds_empty] => [seconds_empty] => -1
+     * }
+     * 
+ * Usage: + *
+     * $ts3->channelList(); //No parameters
+     * $ts3->channelList("-flags"); //Single parameter
+     * $ts3->channelList("-topic -flags -voice -limits -icon"); //Multiple parameters / all
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $params additional parameters [optional] + * @return array channelList + */ + function channelList($params = null) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + if(!empty($params)) { $params = ' '.$params; } + + return $this->getData('multi', 'channellist'.$params); + } + + /** + * channelMove + * + * Moves a channel to a new parent channel with the ID cpid. If order is specified, the channel will be sorted right under the channel with the specified ID. If order is set to 0, the channel will be sorted right below the new parent. + * + * @author Stefan Zehnpfennig + * @param integer $cid channelID + * @param integer $cpid channelParentID + * @param integer $order channelSortOrder + * @return boolean success + */ + function channelMove($cid, $cpid, $order = null) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'channelmove cid='.$cid.' cpid='.$cpid.($order != null ? ' order='.$order : '')); + } + + /** + * channelPermList + * + * Displays a list of permissions defined for a channel. + * + * Output: + *
+     * Array
+     * {
+     *  [cid] => 2 (only in first result)
+     *  [permid] => 8471 (if permsid = false)
+     *  [permsid] => i_channel_needed_delete_power (if permsid = true)
+     *  [permvalue] => 1
+     *  [permnegated] => 0
+     *  [permskip] => 0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cid channelID + * @param boolean $permsid displays permissionName instead of permissionID [optional] + * @return array channelpermlist + */ + function channelPermList($cid, $permsid = false) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'channelpermlist cid='.$cid.($permsid ? ' -permsid' : '')); + } + + /** + * clientAddPerm + * + * Adds a set of specified permissions to a client. Multiple permissions can be added by providing the three parameters of each permission. A permission can be specified by permid or permsid. + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions['permissionID'] = array('permissionValue', 'permskip');
+     * //or you could use Permission Name
+     * $permissions['permissionName'] = array('permissionValue', 'permskip');
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cldbid clientDBID + * @param array $permissions permissions + * @return boolean success + */ + function clientAddPerm($cldbid, $permissions) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(count($permissions) > 0) { + //Permissions given + + //Errorcollector + $errors = array(); + + //Split Permissions to prevent query from overload + $permissions = array_chunk($permissions, 50, true); + + //Action for each splitted part of permission + foreach($permissions as $permission_part) + { + //Create command_string for each command that we could use implode later + $command_string = array(); + + foreach($permission_part as $key => $value) + { + $command_string[] = (is_numeric($key) ? "permid=" : "permsid=").$this->escapeText($key).' permvalue='.$this->escapeText($value[0]).' permskip='.$this->escapeText($value[1]); + } + + $result = $this->getData('boolean', 'clientaddperm cldbid='.$cldbid.' '.implode('|', $command_string)); + + if(!$result['success']) + { + foreach($result['errors'] as $error) + { + $errors[] = $error; + } + } + } + + if(count($errors) == 0) + { + return $this->generateOutput(true, array(), true); + }else{ + return $this->generateOutput(false, $errors, false); + } + }else{ + // No permissions given + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + } + + /** + * clientAvatar + * + * Will return the base64 encoded binary of the clients avatar + * + *
+     * $result = $tsAdmin->clientAvatar($uid);
+     * You can display it like: echo '';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $uid clientUID + * @return array base64 image + */ + function clientAvatar($uid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(empty($uid)) + { + return $this->generateOutput(false, array('Error: empty uid'), false); + } + + $newChars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'); + $auid = ''; + + for ($i = 0; $i <= 19; $i++) { + $char = ord(substr(base64_decode($uid), $i, 1)); + $auid .= $newChars[($char & 0xF0) >> 4]; + $auid .= $newChars[$char & 0x0F]; + } + + $check = $this->ftgetfileinfo(0, '', '/avatar_'.$auid); + + if(!$check["success"]) + { + return $this->generateOutput(false, array('Error: avatar does not exist'), false); + } + + $init = $this->ftInitDownload('/avatar_'.$auid, 0, ''); + + if(!$init["success"]) + { + return $this->generateOutput(false, array('Error: init failed'), false); + } + + $download = $this->ftDownloadFile($init); + + if(is_array($download)) + { + return $download; + }else{ + return $this->generateOutput(true, false, base64_encode($download)); + } + + } + + /** + * clientDbDelete + * + * Deletes a clients properties from the database. + * + * @author Stefan Zehnpfennig + * @param integer $cldbid clientDBID + * @return boolean success + */ + function clientDbDelete($cldbid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'clientdbdelete cldbid='.$cldbid); + } + + /** + * clientDbEdit + * + * Changes a clients settings using given properties. + * + * Input-Array like this: + *
+     * $data = array();
+     *
+     * $data['property'] = 'value';
+     * $data['property'] = 'value';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cldbid clientDBID + * @param array $data clientProperties + * @return boolean success + */ + function clientDbEdit($cldbid, $data) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + $settingsString = ''; + + foreach($data as $key => $value) { + $settingsString .= ' '.strtolower($key).'='.$this->escapeText($value); + } + + return $this->getData('boolean', 'clientdbedit cldbid='.$cldbid.$settingsString); + } + + /** + * clientDbFind + * + * Displays a list of client database IDs matching a given pattern. You can either search for a clients last known nickname or his unique identity by using the -uid option. + * + * Output: + *
+     * Array
+     * {
+     *  [cldbid] => 2
+     * }
+     *	
+ * + * @author Stefan Zehnpfennig + * @param string $pattern clientName + * @param boolean $uid set true to add -uid param [optional] + * @return array clientList + */ + function clientDbFind($pattern, $uid = false) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'clientdbfind pattern='.$this->escapeText($pattern).($uid ? ' -uid' : '')); + } + + /** + * clientDbInfo + * + * Displays detailed database information about a client including unique ID, creation date, etc. + * + * Output: + *
+     * Array
+     * {
+     *  [client_unique_identifier] => nUixbsq/XakrrmbqU8O30R/D8Gc=
+     *  [client_nickname] => par0noid
+     *  [client_database_id] => 2
+     *  [client_created] => 1361027850
+     *  [client_lastconnected] => 1361027850
+     *  [client_totalconnections] => 1
+     *  [client_flag_avatar] =>
+     *  [client_description] =>
+     *  [client_month_bytes_uploaded] => 0
+     *  [client_month_bytes_downloaded] => 0
+     *  [client_total_bytes_uploaded] => 0
+     *  [client_total_bytes_downloaded] => 0
+     *  [client_icon_id] => 0
+     *  [client_base64HashClientUID] => jneilbgomklpfnkjclkoggokfdmdlhnbbpmdpagh
+     *  [client_lastip] => 127.0.0.1
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cldbid clientDBID + * @return array clientDbInfo + */ + function clientDbInfo($cldbid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'clientdbinfo cldbid='.$cldbid); + } + + /** + * clientDbList + * + * Displays a list of client identities known by the server including their database ID, last nickname, etc. + * + * Possible params: [start={offset}] [duration={limit}] [-count] + * + * Output: + *
+     * Array
+     * {
+     *  [count] => 1 (if count parameter is set)
+     *  [cldbid] => 2
+     *  [client_unique_identifier] => nUixbsq/XakrrmbqU8O30R/D8Gc=
+     *  [client_nickname] => par0noid
+     *  [client_created] => 1361027850
+     *  [client_lastconnected] => 1361027850
+     *  [client_totalconnections] => 1
+     *  [client_description] =>
+     *  [client_lastip] => 127.0.0.1
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $start offset [optional] (Default: 0) + * @param integer $duration limit [optional] (Default: -1) + * @param boolean $count set true to add -count param [optional] + * @return array clientdblist + */ + function clientDbList($start = 0, $duration = -1, $count = false) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'clientdblist'.($start != 0 ? ' start='.$start : '').($duration != -1 ? ' duration='.$duration : '').($count ? ' -count' : '')); + } + + /** + * clientDelPerm + * + * Removes a set of specified permissions from a client. Multiple permissions can be removed at once. A permission can be specified by permid or permsid. + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions['permissionID'] = 'permissionValue';
+     * //or you could use Permission Name
+     * $permissions['permissionName'] = 'permissionValue';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cldbid clientDBID + * @param array $permissionIds permissionIDs + * @return boolean success + */ + function clientDelPerm($cldbid, $permissionIds) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + $permissionArray = array(); + + if(count($permissionIds) > 0) { + foreach($permissionIds AS $value) { + $permissionArray[] = (is_numeric($value) ? 'permid=' : 'permsid=').$value; + } + return $this->getData('boolean', 'clientdelperm cldbid='.$cldbid.' '.implode('|', $permissionArray)); + }else{ + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + } + + /** + * clientEdit + * + * Changes a clients settings using given properties. + * + * Input-Array like this: + *
+     * $data = array();
+     *
+     * $data['property'] = 'value';
+     * $data['property'] = 'value';
+     * 
+ * + * Possible properties: CLIENT_NICKNAME, CLIENT_IS_TALKER, CLIENT_DESCRIPTION, CLIENT_IS_CHANNEL_COMMANDER, CLIENT_ICON_ID + * + * @author Stefan Zehnpfennig + * @param integer $clid clientID + * @param array $data clientProperties + * @return boolean success + */ + function clientEdit($clid, $data) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + $settingsString = ''; + + foreach($data as $key => $value) { + $settingsString .= ' '.strtolower($key).'='.$this->escapeText($value); + } + + return $this->getData('boolean', 'clientedit clid='.$clid.$settingsString); + } + + /** + * clientFind + * + * Displays a list of clients matching a given name pattern. + * + * Output: + *
+     * Array
+     * {
+     *  [clid] => 18
+     *  [client_nickname] => par0noid
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $pattern clientName + * @return array clienList + */ + function clientFind($pattern) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'clientfind pattern='.$this->escapeText($pattern)); + } + + /** + * clientGetDbIdFromUid + * + * Displays the database ID matching the unique identifier specified by cluid. + * + * Output: + *
+     * Array
+     * {
+     *  [cluid] => nUixbsq/XakrrmbqU8O30R/D8Gc=
+     *  [cldbid] => 2
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $cluid clientUID + * @return array clientInfo + */ + function clientGetDbIdFromUid($cluid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'clientgetdbidfromuid cluid='.$cluid); + } + + /** + * clientGetIds + * + * Displays all client IDs matching the unique identifier specified by cluid. + * + * Output: + *
+     * Array
+     * {
+     *  [cluid] => nUixbdf/XakrrmsdffO30R/D8Gc=
+     *  [clid] => 7
+     *  [name] => Par0noid
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $cluid clientUID + * @return array clientList + */ + function clientGetIds($cluid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'clientgetids cluid='.$cluid); + } + + /** + * clientGetNameFromDbid + * + * Displays the unique identifier and nickname matching the database ID specified by cldbid. + * + * Output: + *
+     * Array
+     * {
+     *  [cluid] => nUixbsq/XakrrmbqU8O30R/D8Gc=
+     *  [cldbid] => 2
+     *  [name] => Par0noid
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cldbid clientDBID + * @return array clientInfo + */ + function clientGetNameFromDbid($cldbid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'clientgetnamefromdbid cldbid='.$cldbid); + } + + /** + * clientGetNameFromUid + * + * Displays the database ID and nickname matching the unique identifier specified by cluid. + * + * Output: + *
+     * Array
+     * {
+     *  [cluid] => nUixbsq/XakrrmbqU8O30R/D8Gc=
+     *  [cldbid] => 2
+     *  [name] => Par0noid
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $cluid clientUID + * @return array clientInfo + */ + function clientGetNameFromUid($cluid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'clientgetnamefromuid cluid='.$cluid); + } + + /** + * clientInfo + * + * Displays detailed configuration information about a client including unique ID, nickname, client version, etc. + * + * Output: + *
+     * Array
+     * {
+     *  [cid] => 2
+     *  [client_idle_time] => 4445369
+     *  [client_unique_identifier] => nUixbsq/XakrrmbqU8O30R/D8Gc=
+     *  [client_nickname] => par0noid
+     *  [client_version] => 3.0.9.2 [Build: 1351504843]
+     *  [client_platform] => Windows
+     *  [client_input_muted] => 1
+     *  [client_output_muted] => 1
+     *  [client_outputonly_muted] => 0
+     *  [client_input_hardware] => 1
+     *  [client_output_hardware] => 1
+     *  [client_default_channel] =>
+     *  [client_meta_data] =>
+     *  [client_is_recording] => 0
+     *  [client_version_sign] => ldWL49uDKC3N9uxdgWRMTOzUabc1nBqUiOa+Nal5HvdxJiN4fsTnmmPo5tvglN7WqoVoFfuuKuYq1LzodtEtCg==
+     *  [client_security_hash] =>
+     *  [client_login_name] =>
+     *  [client_database_id] => 2
+     *  [client_channel_group_id] => 5
+     *  [client_servergroups] => 6
+     *  [client_created] => 1361027850
+     *  [client_lastconnected] => 1361027850
+     *  [client_totalconnections] => 1
+     *  [client_away] => 0
+     *  [client_away_message] =>
+     *  [client_type] => 0
+     *  [client_flag_avatar] =>
+     *  [client_talk_power] => 75
+     *  [client_talk_request] => 0
+     *  [client_talk_request_msg] =>
+     *  [client_description] =>
+     *  [client_is_talker] => 0
+     *  [client_month_bytes_uploaded] => 0
+     *  [client_month_bytes_downloaded] => 0
+     *  [client_total_bytes_uploaded] => 0
+     *  [client_total_bytes_downloaded] => 0
+     *  [client_is_priority_speaker] => 0
+     *  [client_nickname_phonetic] =>
+     *  [client_needed_serverquery_view_power] => 75
+     *  [client_default_token] =>
+     *  [client_icon_id] => 0
+     *  [client_is_channel_commander] => 0
+     *  [client_country] =>
+     *  [client_channel_group_inherited_channel_id] => 2
+     *  [client_badges] => Overwolf=0
+     *  [client_base64HashClientUID] => jneilbgomklpfnkjclkoggokfdmdlhnbbpmdpagh
+     *  [connection_filetransfer_bandwidth_sent] => 0
+     *  [connection_filetransfer_bandwidth_received] => 0
+     *  [connection_packets_sent_total] => 12130
+     *  [connection_bytes_sent_total] => 542353
+     *  [connection_packets_received_total] => 12681
+     *  [connection_bytes_received_total] => 592935
+     *  [connection_bandwidth_sent_last_second_total] => 82
+     *  [connection_bandwidth_sent_last_minute_total] => 92
+     *  [connection_bandwidth_received_last_second_total] => 84
+     *  [connection_bandwidth_received_last_minute_total] => 88
+     *  [connection_connected_time] => 5908749
+     *  [connection_client_ip] => 127.0.0.1
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $clid clientID + * @return array clientInformation + */ + function clientInfo($clid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'clientinfo clid='.$clid); + } + + /** + * clientKick + * + * Kicks one or more clients specified with clid from their currently joined channel or from the server, depending on reasonid. The reasonmsg parameter specifies a text message sent to the kicked clients. This parameter is optional and may only have a maximum of 40 characters. + * + * @author Stefan Zehnpfennig + * @param integer $clid clientID + * @param string $kickMode kickMode (server or channel) (Default: server) + * @param string $kickmsg kick reason [optional] + * @return boolean success + */ + function clientKick($clid, $kickMode = "server", $kickmsg = "") { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(in_array($kickMode, array('server', 'channel'))) { + + if($kickMode == 'server') { $from = '5'; } + if($kickMode == 'channel') { $from = '4'; } + + if(!empty($kickmsg)) { $msg = ' reasonmsg='.$this->escapeText($kickmsg); } else{ $msg = ''; } + + return $this->getData('boolean', 'clientkick clid='.$clid.' reasonid='.$from.$msg); + }else{ + $this->addDebugLog('invalid kickMode'); + return $this->generateOutput(false, array('Error: invalid kickMode'), false); + } + } + + /** + * clientList + * + * Displays a list of clients online on a virtual server including their ID, nickname, status flags, etc. The output can be modified using several command options. Please note that the output will only contain clients which are currently in channels you're able to subscribe to. + * + * Possible params: [-uid] [-away] [-voice] [-times] [-groups] [-info] [-icon] [-country] [-ip] [-badges] + * + * Output: (without parameters) + *
+     * Array
+     * {
+     *  [clid] => 1
+     *  [cid] => 1
+     *  [client_database_id] => 2
+     *  [client_nickname] => Par0noid
+     *  [client_type] => 0
+     *  [-uid] => [client_unique_identifier] => nUixbsq/XakrrmbqU8O30R/D8Gc=
+     *  [-away] => [client_away] => 0
+     *  [-away] => [client_away_message] =>
+     *  [-voice] => [client_flag_talking] => 0
+     *  [-voice] => [client_input_muted] => 0
+     *  [-voice] => [client_output_muted] => 0
+     *  [-voice] => [client_input_hardware] => 0
+     *  [-voice] => [client_output_hardware] => 0
+     *  [-voice] => [client_talk_power] => 0
+     *  [-voice] => [client_is_talker] => 0
+     *  [-voice] => [client_is_priority_speaker] => 0
+     *  [-voice] => [client_is_recording] => 0
+     *  [-voice] => [client_is_channel_commander] => 0
+     *  [-times] => [client_idle_time] => 1714
+     *  [-times] => [client_created] => 1361027850
+     *  [-times] => [client_lastconnected] => 1361042955
+     *  [-groups] => [client_servergroups] => 6,7
+     *  [-groups] => [client_channel_group_id] => 8
+     *  [-groups] => [client_channel_group_inherited_channel_id] => 1
+     *  [-info] => [client_version] => 3.0.9.2 [Build: 1351504843]
+     *  [-info] => [client_platform] => Windows
+     *  [-icon] => [client_icon_id] => 0
+     *  [-country] => [client_country] =>
+     *  [-ip] => [connection_client_ip] => 127.0.0.1
+     *  [-badges] => [client_badges] => Overwolf=0
+     * }
+     *
+     * Usage:
+     *
+     * $ts3->clientList(); //No parameters
+     * $ts3->clientList("-uid"); //Single parameter
+     * $ts3->clientList("-uid -away -voice -times -groups -info -country -icon -ip -badges"); //Multiple parameters
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $params additional parameters [optional] + * @return array clientList + */ + function clientList($params = null) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(!empty($params)) { $params = ' '.$params; } + + return $this->getData('multi', 'clientlist'.$params); + } + + /** + * clientMove + * + * Moves one or more clients specified with clid to the channel with ID cid. If the target channel has a password, it needs to be specified with cpw. If the channel has no password, the parameter can be omitted. + * + * @author Stefan Zehnpfennig + * @param integer $clid clientID + * @param integer $cid channelID + * @param string $cpw channelPassword [optional] + * @return boolean success + */ + function clientMove($clid, $cid, $cpw = null) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'clientmove clid='.$clid.' cid='.$cid.(!empty($cpw) ? ' cpw='.$this->escapeText($cpw) : '')); + } + + /** + * clientPermList + * + * Displays a list of permissions defined for a client. + * + * Output: + *
+     * Array
+     * {
+     *  [permid] => 20654 //with permsid = false
+     *  [permsid] => b_client_ignore_bans //with permsid = true
+     *  [permvalue] => 1
+     *  [permnegated] => 0
+     *  [permskip] => 0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param intege $cldbid clientDBID + * @param boolean $permsid set true to add -permsid param [optional] + * @return array clientPermList + */ + function clientPermList($cldbid, $permsid = false) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'clientpermlist cldbid='.$cldbid.($permsid ? ' -permsid' : '')); + } + + /** + * clientPoke + * + * Sends a poke message to the client specified with clid. + * + * @author Stefan Zehnpfennig + * @param integer $clid clientID + * @param string $msg pokeMessage + * @return boolean success + */ + function clientPoke($clid, $msg) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'clientpoke clid='.$clid.' msg='.$this->escapeText($msg)); + } + + /** + * clientSetServerQueryLogin + * + * Updates your own ServerQuery login credentials using a specified username. The password will be auto-generated. + * + * Output: + *
+     * Array
+     * {
+     *  [client_login_password] => +r\/TQqvR
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $username username + * @return array userInfomation + */ + function clientSetServerQueryLogin($username) { + return $this->getData('array', 'clientsetserverquerylogin client_login_name='.$this->escapeText($username)); + } + + /** + * clientUpdate + * + * Change your ServerQuery clients settings using given properties. + * + * Input-Array like this: + *
+     * $data = array();
+     * $data['property'] = 'value';
+     * $data['property'] = 'value';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param array $data clientProperties + * @return boolean success + */ + function clientUpdate($data) { + $settingsString = ''; + + foreach($data as $key => $value) { + $settingsString .= ' '.strtolower($key).'='.$this->escapeText($value); + } + + return $this->getData('boolean', 'clientupdate '.$settingsString); + } + + /** + * complainAdd + * + * Submits a complaint about the client with database ID tcldbid to the server. + * + * @author Stefan Zehnpfennig + * @param integer $tcldbid targetClientDBID + * @param string $msg complainMessage + * @return boolean success + */ + function complainAdd($tcldbid, $msg) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'complainadd tcldbid='.$tcldbid.' message='.$this->escapeText($msg)); + } + + /** + * complainDelete + * + * Deletes the complaint about the client with ID tcldbid submitted by the client with ID fcldbid from the server. + * + * @author Stefan Zehnpfennig + * @param integer $tcldbid targetClientDBID + * @param integer $fcldbid fromClientDBID + * @return boolean success + */ + function complainDelete($tcldbid, $fcldbid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'complaindel tcldbid='.$tcldbid.' fcldbid='.$fcldbid); + } + + /** + * complainDeleteAll + * + * Deletes all complaints about the client with database ID tcldbid from the server. + * + * @author Stefan Zehnpfennig + * @param integer $tcldbid targetClientDBID + * @return boolean success + */ + function complainDeleteAll($tcldbid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'complaindelall tcldbid='.$tcldbid); + } + + /** + * complainList + * + * Displays a list of complaints on the selected virtual server. If tcldbid is specified, only complaints about the targeted client will be shown. + * + * Output: + *
+     * Array
+     * {
+     *  [tcldbid] => 2
+     *  [tname] => par0noid
+     *  [fcldbid] => 1
+     *  [fname] => serveradmin from 127.0.0.1:6814
+     *  [message] => Steals crayons
+     *  [timestamp] => 1361044090
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $tcldbid targetClientDBID [optional] + * @return array complainList + */ + function complainList($tcldbid = null) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + if(!empty($tcldbid)) { $tcldbid = ' tcldbid='.$tcldbid; } + return $this->getData('multi', 'complainlist'.$tcldbid); + } + + + /** + * customInfo + * + * Displays a list of custom properties for the client specified with cldbid. + * + * Output: + *
+     * Array
+     * {
+     * 	[0] => Array
+     *  	{
+     *  		[cldbid] => 1
+     *			[ident] => abc
+     *			[value] => def
+     *	  	}
+     * 	[1] => Array
+     *  	{
+     *			[ident] => ghi
+     *			[value] => jkl
+     *	  	}
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $cldbid clientDBID + * @return array customInfos + */ + function customInfo($cldbid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'custominfo cldbid='.$cldbid); + } + + /** + * customSearch + * + * Searches for custom client properties specified by ident and value. The value parameter can include regular characters and SQL wildcard characters (e.g. %). + * + * Output: (ident=abc, pattern=%) + *
+     * Array
+     * {
+     * 	[0] => Array
+     *  	{
+     *  		[cldbid] => 1
+     *			[ident] => abc
+     *			[value] => def
+     *	  	}
+     * 	[1] => Array
+     *  	{
+     *  		[cldbid] => 2
+     *			[ident] => abc
+     *			[value] => def
+     *	  	}
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $ident customIdent + * @param string $pattern searchpattern + * @return array customSearchInfos + */ + function customSearch($ident, $pattern) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'customsearch ident='.$this->escapeText($ident).' pattern='.$this->escapeText($pattern)); + } + + /** + * execOwnCommand + * + * executes a command that isn't defined in class and returns data like your propose + * + * Modes: + *
    + *
  • 0: execute -> return boolean
  • + *
  • 1: execute -> return normal array
  • + *
  • 2: execute -> return multidimensional array
  • + *
  • 3: execute -> return plaintext serverquery
  • + *
+ * + * @author Stefan Zehnpfennig + * @param string $mode executionMode + * @param string $command command + * @return mixed result + */ + function execOwnCommand($mode, $command) { + if($mode == '0') { + return $this->getData('boolean', $command); + } + if($mode == '1') { + return $this->getData('array', $command); + } + if($mode == '2') { + return $this->getData('multi', $command); + } + if($mode == '3') { + return $this->getData('plain', $command); + } + } + + /** + * ftCreateDir + * + * Creates new directory in a channels file repository. + * + * @author Stefan Zehnpfennig + * @param string $cid channelId + * @param string $cpw channelPassword (leave blank if not needed) + * @param string $dirname dirPath + * @return boolean success + */ + function ftCreateDir($cid, $cpw = null, $dirname) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'ftcreatedir cid='.$cid.' cpw='.$this->escapeText($cpw).' dirname='.$this->escapeText($dirname)); + } + + /** + * ftDeleteFile + * + * Deletes one or more files stored in a channels file repository. + * + * Input-Array like this: + *
+     * $files = array();
+     *
+     * $files[] = '/pic1.jpg';
+     * $files[] = '/dokumente/test.txt';
+     * $files[] = '/dokumente';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $cid channelID + * @param string $cpw channelPassword (leave blank if not needed) + * @param array $files files + * @return boolean success + */ + function ftDeleteFile($cid, $cpw = '', $files) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + $fileArray = array(); + + if(count($files) > 0) { + foreach($files AS $file) { + $fileArray[] = 'name='.$this->escapeText($file); + } + return $this->getData('boolean', 'ftdeletefile cid='.$cid.' cpw='.$this->escapeText($cpw).' '.implode('|', $fileArray)); + }else{ + $this->addDebugLog('no files given'); + return $this->generateOutput(false, array('Error: no files given'), false); + } + } + + /** + * ftDownloadFile + * + * Ddownloads a file and returns its contents + * + * @author Stefan Zehnpfennig + * @param array $data return of ftInitDownload + * @return array downloadedFile + */ + function ftDownloadFile($data) { + $errnum = null; + $errstr = null; + $this->runtime['fileSocket'] = @fsockopen($this->runtime['host'], $data['data']['port'], $errnum, $errstr, $this->runtime['timeout']); + if($this->runtime['fileSocket']) { + $this->ftSendKey($data['data']['ftkey']); + $content = $this->ftRead($data['data']['size']); + @fclose($this->runtime['fileSocket']); + $this->runtime['fileSocket'] = ''; + return $content; + }else{ + $this->addDebugLog('fileSocket returns '.$errnum. ' | '.$errstr); + return $this->generateOutput(false, array('Error in fileSocket: '.$errnum. ' | '.$errstr), false); + } + } + + /** + * ftGetFileInfo + * + * Displays detailed information about one or more specified files stored in a channels file repository. + * + * + * @author Stefan Zehnpfennig + * @param string $cid channelID + * @param string $cpw channelPassword (leave blank if not needed) + * @param string $file path to file + * @return boolean success + */ + function ftGetFileInfo($cid, $cpw = '', $file) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + return $this->getData('multi', 'ftgetfileinfo cid='.$cid.' cpw='.$this->escapeText($cpw).' name='.$this->escapeText($file)); + } + + /** + * ftGetFileList + * + * Displays a list of files and directories stored in the specified channels file repository. + * + * Output: + *
+     * Array
+     * {
+     *  [cid] => 231
+     *  [path] => /
+     *  [name] => Documents
+     *  [size] => 0
+     *  [datetime] => 1286633633
+     *  [type] => 0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $cid channelID + * @param string $cpw channelPassword (leave blank if not needed) + * @param string $path filePath + * @return array fileList + */ + function ftGetFileList($cid, $cpw = '', $path) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'ftgetfilelist cid='.$cid.' cpw='.$this->escapeText($cpw).' path='.$this->escapeText($path)); + } + + /** + * ftInitDownload + * + * Initializes a file transfer download. clientftfid is an arbitrary ID to identify the file transfer on client-side. On success, the server generates a new ftkey which is required to start downloading the file through TeamSpeak 3's file transfer interface. Since version 3.0.13 there is an optional proto parameter. The client can request a protocol version with it. Currently only 0 and 1 are supported which only differ in the way they handle some timings. The server will reply which protocol version it will support. The server will reply with an ip parameter if it determines the filetransfer subsystem is not reachable by the ip that is currently being used for the query connection. + * + * Output: + *
+     * Array
+     * {
+     *  [clientftfid] => 89
+     *  [serverftfid] => 3
+     *  [ftkey] => jSzWiRmFGdZnoJzW7BSDYJRUWB2WAUhb
+     *  [port] => 30033
+     *  [size] => 94
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $name filePath + * @param string $cid channelID + * @param string $cpw channelPassword (leave blank if not needed) + * @param integer $seekpos seekpos (default = 0) [optional] + * @param integer $proto proto (default = NULL) [optional] + * @return array initDownloadFileInfo + */ + function ftInitDownload($name, $cid, $cpw = '', $seekpos = 0, $proto = null) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'ftinitdownload clientftfid='.rand(1,99).' name='.$this->escapeText($name).' cid='.$cid.' cpw='.$this->escapeText($cpw).' seekpos='.$seekpos.($proto !== null ? ' proto='.$proto: '')); + } + + /** + * ftInitUpload + * + * Initializes a file transfer upload. clientftfid is an arbitrary ID to identify the file transfer on client-side. On success, the server generates a new ftkey which is required to start uploading the file through TeamSpeak 3's file transfer interface. Since version 3.0.13 there is an optional proto parameter. The client can request a protocol version with it. Currently only 0 and 1 are supported which only differ in the way they handle some timings. The server will reply which protocol version it will support. The server will reply with an ip parameter if it determines the filetransfer subsystem is not reachable by the ip that is currently being used for the query connection + * + * Output: + *
+     * Array
+     * {
+     *  [clientftfid] => 84
+     *  [serverftfid] => 41
+     *  [ftkey] => HCnXpunOdAorqj3dGqfiuLszX18O0PHP
+     *  [port] => 30033
+     *  [seekpos] => 0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $filename filePath + * @param string $cid channelID + * @param integer $size fileSize in bytes + * @param string $cpw channelPassword (leave blank if not needed) + * @param boolean $overwrite overwrite [optional] (default = 0) + * @param boolean $resume resume [optional] (default = 0) + * @param integer $proto proto (default = NULL) [optional] + * @return array initUploadFileInfo + */ + function ftInitUpload($filename, $cid, $size, $cpw = '', $overwrite = false, $resume = false, $proto = null) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if($overwrite) { $overwrite = ' overwrite=1'; }else{ $overwrite = ' overwrite=0'; } + if($resume) { $resume = ' resume=1'; }else{ $resume = ' resume=0'; } + + return $this->getData('array', 'ftinitupload clientftfid='.rand(1,99).' name='.$this->escapeText($filename).' cid='.$cid.' cpw='.$this->escapeText($cpw).' size='.($size + 1).$overwrite.$resume.($proto !== null ? ' proto='.$proto: '')); + } + + /** + * ftList + * + * Displays a list of running file transfers on the selected virtual server. The output contains the path to which a file is uploaded to, the current transfer rate in bytes per second, etc + * + * Output: + *
+     * Array
+     * {
+     *  [clid] => 1
+     *  [cldbid] => 2019
+     *  [path] => files/virtualserver_11/channel_231
+     *  [name] => 1285412348878.png
+     *  [size] => 1161281
+     *  [sizedone] => 275888
+     *  [clientftfid] => 15
+     *  [serverftfid] => 52
+     *  [sender] => 0
+     *  [status] => 1
+     *  [current_speed] => 101037.4453
+     *  [average_speed] => 101037.4453
+     *  [runtime] => 2163
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array fileTransferList + */ + function ftList() { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'ftlist'); + } + + /** + * ftRenameFile + * + * Renames a file in a channels file repository. If the two parameters tcid and tcpw are specified, the file will be moved into another channels file repository. + * + * @author Stefan Zehnpfennig + * @param integer $cid channelID + * @param string $cpw channelPassword (leave blank if not needed) + * @param string $oldname oldFilePath + * @param string $newname newFilePath + * @param string $tcid targetChannelID [optional] + * @param string $tcpw targetChannelPassword [optional] + * @return boolean success + */ + function ftRenameFile($cid, $cpw = null, $oldname, $newname, $tcid = null, $tcpw = null) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + $newTarget = ($tcid != null ? ' tcid='.$tcid.' '.$tcpw : ''); + return $this->getData('boolean', 'ftrenamefile cid='.$cid.' cpw='.$cpw.' oldname='.$this->escapeText($oldname).' newname='.$this->escapeText($newname).$newTarget); + } + + /** + * ftStop + * + * Stops the running file transfer with server-side ID serverftfid. + * + * @author Stefan Zehnpfennig + * @param integer $serverftfid serverFileTransferID + * @param boolean $delete delete incomplete file [optional] (default: true) + * @return boolean success + */ + function ftStop($serverftfid, $delete = true) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'ftstop serverftfid='.$serverftfid.' delete='.($delete ? '1' : '0')); + } + + /** + * ftUploadFile + * + * Uploads a file to server + * To check if upload was successful, you have to search for this file in fileList after + * + * @author Stefan Zehnpfennig + * @param array $data return of ftInitUpload + * @param string $uploadData data which should be uploaded + * @return array response + */ + function ftUploadFile($data, $uploadData) { + $this->runtime['fileSocket'] = @fsockopen($this->runtime['host'], $data['data']['port'], $errnum, $errstr, $this->runtime['timeout']); + if($this->runtime['fileSocket']) { + $this->ftSendKey($data['data']['ftkey'], "\n"); + $this->ftSendData($uploadData); + @fclose($this->runtime['fileSocket']); + $this->runtime['fileSocket'] = ''; + return $this->generateOutput(true, array(), true); + }else{ + $this->addDebugLog('fileSocket returns '.$errnum. ' | '.$errstr); + return $this->generateOutput(false, array('Error in fileSocket: '.$errnum. ' | '.$errstr), false); + } + } + + /** + * gm + * + * Sends a text message to all clients on all virtual servers in the TeamSpeak 3 Server instance. + * + * @author Stefan Zehnpfennig + * @param string $msg message + * @return boolean success + */ + function gm($msg) { + if(empty($msg)) { + $this->addDebugLog('empty message given'); + return $this->generateOutput(false, array('Error: empty message given'), false); + } + return $this->getData('boolean', 'gm msg='.$this->escapeText($msg)); + } + + /** + * hostInfo + * + * Displays detailed connection information about the server instance including uptime, number of virtual servers online, traffic information, etc. + * + * Output: + *
+     * Array
+     * {
+     *  [instance_uptime] => 19038
+     *  [host_timestamp_utc] => 1361046825
+     *  [virtualservers_running_total] => 1
+     *  [virtualservers_total_maxclients] => 32
+     *  [virtualservers_total_clients_online] => 1
+     *  [virtualservers_total_channels_online] => 2
+     *  [connection_filetransfer_bandwidth_sent] => 0
+     *  [connection_filetransfer_bandwidth_received] => 0
+     *  [connection_filetransfer_bytes_sent_total] => 0
+     *  [connection_filetransfer_bytes_received_total] => 0
+     *  [connection_packets_sent_total] => 24853
+     *  [connection_bytes_sent_total] => 1096128
+     *  [connection_packets_received_total] => 25404
+     *  [connection_bytes_received_total] => 1153918
+     *  [connection_bandwidth_sent_last_second_total] => 82
+     *  [connection_bandwidth_sent_last_minute_total] => 81
+     *  [connection_bandwidth_received_last_second_total] => 84
+     *  [connection_bandwidth_received_last_minute_total] => 87
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array hostInformation + */ + function hostInfo() { + return $this->getData('array', 'hostinfo'); + } + + /** + * instanceEdit + * + * Changes the server instance configuration using given properties. + * + * Input-Array like this: + *
+     * $data = array();
+     *
+     * $data['setting'] = 'value';
+     * $data['setting'] = 'value';
+     * 
+ * + * Possible properties: SERVERINSTANCE_GUEST_SERVERQUERY_GROUP, SERVERINSTANCE_TEMPLATE_SERVERADMIN_GROUP, SERVERINSTANCE_FILETRANSFER_PORT, SERVERINSTANCE_MAX_DOWNLOAD_TOTAL_BANDWITDH, SERVERINSTANCE_MAX_UPLOAD_TOTAL_BANDWITDH, SERVERINSTANCE_TEMPLATE_SERVERDEFAULT_GROUP, SERVERINSTANCE_TEMPLATE_CHANNELDEFAULT_GROUP, SERVERINSTANCE_TEMPLATE_CHANNELADMIN_GROUP, SERVERINSTANCE_SERVERQUERY_FLOOD_COMMANDS, SERVERINSTANCE_SERVERQUERY_FLOOD_TIME, SERVERINSTANCE_SERVERQUERY_FLOOD_BAN_TIME + * + * @author Stefan Zehnpfennig + * @param array $data instanceProperties + * @return boolean success + */ + function instanceEdit($data) { + if(count($data) > 0) { + $settingsString = ''; + + foreach($data as $key => $val) { + $settingsString .= ' '.strtolower($key).'='.$this->escapeText($val); + } + return $this->getData('boolean', 'instanceedit '.$settingsString); + }else{ + $this->addDebugLog('empty array entered'); + return $this->generateOutput(false, array('Error: You can \'t give an empty array'), false); + } + } + + /** + * instanceInfo + * + * Displays the server instance configuration including database revision number, the file transfer port, default group IDs, etc. + * + * Output: + *
+     * Array
+     * {
+     *  [serverinstance_database_version] => 20
+     *  [serverinstance_filetransfer_port] => 30033
+     *  [serverinstance_max_download_total_bandwidth] => 18446744073709551615
+     *  [serverinstance_max_upload_total_bandwidth] => 18446744073709551615
+     *  [serverinstance_guest_serverquery_group] => 1
+     *  [serverinstance_serverquery_flood_commands] => 10
+     *  [serverinstance_serverquery_flood_time] => 3
+     *  [serverinstance_serverquery_ban_time] => 600
+     *  [serverinstance_template_serveradmin_group] => 3
+     *  [serverinstance_template_serverdefault_group] => 5
+     *  [serverinstance_template_channeladmin_group] => 1
+     *  [serverinstance_template_channeldefault_group] => 4
+     *  [serverinstance_permissions_version] => 15
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array instanceInformation + */ + function instanceInfo() { + return $this->getData('array', 'instanceinfo'); + } + + /** + * logAdd + * + * Writes a custom entry into the servers log. Depending on your permissions, you'll be able to add entries into the server instance log and/or your virtual servers log. The loglevel parameter specifies the type of the entry. + * + * @author Stefan Zehnpfennig + * @param integer $logLevel loglevel between 1 and 4 + * @param string $logMsg logMessage + * @return boolean success + */ + function logAdd($logLevel, $logMsg) { + if($logLevel >=1 and $logLevel <= 4) { + if(!empty($logMsg)) { + return $this->getData('boolean', 'logadd loglevel='.$logLevel.' logmsg='.$this->escapeText($logMsg)); + }else{ + $this->addDebugLog('logMessage empty!'); + return $this->generateOutput(false, array('Error: logMessage empty!'), false); + } + }else{ + $this->addDebugLog('invalid logLevel!'); + return $this->generateOutput(false, array('Error: invalid logLevel!'), false); + } + } + + /** + * login + * + * Authenticates with the TeamSpeak 3 Server instance using given ServerQuery login credentials. + * + * @author Stefan Zehnpfennig + * @param string $username username + * @param string $password password + * @return boolean success + */ + function login($username, $password) { + return $this->getData('boolean', 'login '.$this->escapeText($username).' '.$this->escapeText($password)); + } + + /** + * logout + * + * Deselects the active virtual server and logs out from the server instance. + * + * @author Stefan Zehnpfennig + * @return boolean success + */ + function logout() { + $this->runtime['selected'] = false; + return $this->getData('boolean', 'logout'); + } + + /** + * logView + * + * Displays a specified number of entries from the servers log. If instance is set to 1, the server will return lines from the master logfile (ts3server_0.log) instead of the selected virtual server logfile. + * + * Output: + *
+     * Array
+     * {
+     *  [last_pos] => 0
+     *  [file_size] => 1085
+     *  [l] => 2012-01-10 20:34:31.379260|INFO    |ServerLibPriv |   | TeamSpeak 3 Server 3.0.1 (2011-11-17 07:34:30)
+     * }
+     * {
+     *  [l] => 2012-01-10 20:34:31.380260|INFO    |DatabaseQuery |   | dbPlugin name:    SQLite3 plugin, Version 2, (c)TeamSpeak Systems GmbH
+     * }
+     * {
+     *  [l] => 2012-01-10 20:34:31.380260|INFO    |DatabaseQuery |   | dbPlugin version: 3.7.3
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $lines between 1 and 100 + * @param integer $reverse {1|0} [optional] + * @param integer $instance {1|0} [optional] + * @param integer $begin_pos {1|0} [optional] + * @return multidimensional-array logEntries + */ + function logView($lines, $reverse = 0, $instance = 0, $begin_pos = 0) { + if($lines >=1 and $lines <=100) { + return $this->getData('multi', 'logview lines='.$lines.' reverse='.($reverse == 0 ? '0' : '1').' instance='.($instance == 0 ? '0' : '1').' begin_pos='.($begin_pos == 0 ? '0' : $begin_pos)); + }else{ + $this->addDebugLog('please choose a limit between 1 and 100'); + $this->generateOutput(false, array('Error: please choose a limit between 1 and 100'), false); + } + } + + /** + * messageAdd + * + * Sends an offline message to the client specified by cluid. + * + * @author Stefan Zehnpfennig + * @param string $cluid clientUID + * @param string $subject Subject of the message + * @param string $message Text of the message + * @return boolean success + */ + function messageAdd($cluid, $subject, $message) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'messageadd cluid='.$cluid.' subject='.$this->escapeText($subject).' message='.$this->escapeText($message)); + } + + /** + * messageDelete + * + * Deletes an existing offline message with ID msgid from your inbox. + * + * @author Stefan Zehnpfennig + * @param string $messageID messageID + * @return boolean success + */ + function messageDelete($messageID) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'messagedel msgid='.$messageID); + } + + /** + * messageGet + * + * Displays an existing offline message with ID msgid from your inbox. Please note that this does not automatically set the flag_read property of the message. + * + * @author Stefan Zehnpfennig + * @param string $messageID messageID + * @return array messageInformation + */ + function messageGet($messageID) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'messageget msgid='.$messageID); + } + + /** + * messageList + * + * Displays a list of offline messages you've received. The output contains the senders unique identifier, the messages subject, etc. + * + * @author Stefan Zehnpfennig + * @return array messageInformation + */ + function messageList() { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'messagelist'); + } + + /** + * messageUpdateFlag + * + * Updates the flag_read property of the offline message specified with msgid. If flag is set to 1, the message will be marked as read. + * + * @author Stefan Zehnpfennig + * @param string $messageID messageID + * @param integer $flag flag {1|0} + * @return array messageInformation + */ + function messageUpdateFlag($messageID, $flag = 1) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'messageupdateflag msgid='.$messageID.' flag='.$flag); + } + + /** + * permFind + * + * Displays detailed information about all assignments of the permission specified with permid. The output is similar to permoverview which includes the type and the ID of the client, channel or group associated with the permission. A permission can be specified by permid or permsid. + * + * Output: + *
+     * Array
+     * {
+     *  [token] => eKnFZQ9EK7G7MhtuQB6+N2B1PNZZ6OZL3ycDp2OW
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param mixed $perm permid or permsid + * @return array permissionInfoList + */ + function permFind($perm) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'permfind '.(is_int($perm) || ctype_digit($perm) ? 'permid=' : 'permsid=').$perm); + } + + + /** + * permGet + * + * Displays the current value of the permission specified with permid or permsid for your own connection. This can be useful when you need to check your own privileges. + * + * The perm parameter can be used as permid or permsid, it will switch the mode automatically. + * + * Output: + *
+     * Array
+     * {
+     *		[permsid] => i_channel_create_modify_with_codec_maxquality
+     *     [permid] => 96
+     *     [permvalue] => 10
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param mixed $perm permid or permsid + * @return array permissionInfo + */ + function permGet($perm) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'permget '.(is_int($perm) || ctype_digit($perm) ? 'permid=' : 'permsid=').$perm); + } + + /** + * permIdGetByName + * + * Displays the database ID of one or more permissions specified by permsid. + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions[] = 'permissionName';
+     * 
+ * Output: + *
+     * Array
+     * {
+     *  [permsid] => b_serverinstance_help_view
+     *  [permid] => 4353
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $permsids permNames + * @return array permissionList + */ + function permIdGetByName($permsids) { + $permissionArray = array(); + + if(count($permsids) > 0) { + foreach($permsids AS $value) { + $permissionArray[] = 'permsid='.$value; + } + return $this->getData('multi', 'permidgetbyname '.$this->escapeText(implode('|', $permissionArray))); + }else{ + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + + } + + + /** + * permissionList + * + * Displays a list of permissions available on the server instance including ID, name and description. + * If the new parameter is set the permissionlist will return with the new output format. + * + * Output: (with new parameter) + *
+     * [0] => Array
+     *     (
+     *         [num] => 1
+     *         [group_id_end] => 0
+     *         [pcount] => 0
+     *     )
+     *
+     * [1] => Array
+     *     (
+     *         [num] => 2
+     *         [group_id_end] => 7
+     *         [pcount] => 7
+     *         [permissions] => Array
+     *             (
+     *                 [0] => Array
+     *                     (
+     *                         [permid] => 1
+     *                         [permname] => b_serverinstance_help_view
+     *                         [permdesc] => Retrieve information about ServerQuery commands
+     *                         [grantpermid] => 32769
+     *                     )
+     *
+     *                 [1] => Array
+     *                     (
+     *                         [permid] => 2
+     *                         [permname] => b_serverinstance_version_view
+     *                         [permdesc] => Retrieve global server version (including platform and build number)
+     *                         [grantpermid] => 32770
+     *                     )
+     *
+     *                 [2] => Array
+     *                     (
+     *                         [permid] => 3
+     *                         [permname] => b_serverinstance_info_view
+     *                         [permdesc] => Retrieve global server information
+     *                         [grantpermid] => 32771
+     *                     )
+     *
+     *                 [3] => Array
+     *                     (
+     *                         [permid] => 4
+     *                         [permname] => b_serverinstance_virtualserver_list
+     *                         [permdesc] => List virtual servers stored in the database
+     *                         [grantpermid] => 32772
+     *                     )
+     *
+     *                 [4] => Array
+     *                     (
+     *                         [permid] => 5
+     *                         [permname] => b_serverinstance_binding_list
+     *                         [permdesc] => List active IP bindings on multi-homed machines
+     *                         [grantpermid] => 32773
+     *                     )
+     *
+     *                [5] => Array
+     *                     (
+     *                         [permid] => 6
+     *                         [permname] => b_serverinstance_permission_list
+     *                         [permdesc] => List permissions available available on the server instance
+     *                         [grantpermid] => 32774
+     *                     )
+     *
+     *                 [6] => Array
+     *                     (
+     *                         [permid] => 7
+     *                         [permname] => b_serverinstance_permission_find
+     *                         [permdesc] => Search permission assignments by name or ID
+     *                         [grantpermid] => 32775
+     *                     )
+     *
+     *             )
+     *
+     *     )
+     * 
+ * + * @author Stefan Zehnpfennig + * @param boolean $new [optional] add new parameter + * @return array permissionList + */ + function permissionList($new = false) { + if($new === true) { + $groups = array(); + $permissions = array(); + + $response = $this->getElement('data', $this->getData('multi', 'permissionlist -new')); + + $gc = 1; + + foreach($response as $field) { + if(isset($field['group_id_end'])) { + $groups[] = array('num' => $gc, 'group_id_end' => $field['group_id_end']); + $gc++; + }else{ + $permissions[] = $field; + } + } + + $counter = 0; + + for($i = 0; $i < count($groups); $i++) { + $rounds = $groups[$i]['group_id_end'] - $counter; + $groups[$i]['pcount'] = $rounds; + for($j = 0; $j < $rounds; $j++) { + $groups[$i]['permissions'][] = array('permid' => ($counter + 1), 'permname' => $permissions[$counter]['permname'], 'permdesc' => $permissions[$counter]['permdesc'], 'grantpermid' => ($counter + 32769)); + $counter++; + } + } + + return $groups; + + }else{ + return $this->getData('multi', 'permissionlist'); + } + } + + /** + * permOverview + * + * Displays all permissions assigned to a client for the channel specified with cid. If permid is set to 0, all permissions will be displayed. A permission can be specified by permid or permsid. + * + * If you set the permsid parameter, the permid parameter will be ignored. + * + * Output: + *
+     * Array
+     * {
+     *  [t] => 0
+     *  [id1] => 2
+     *  [id2] => 0
+     *  [p] => 16777
+     *  [v] => 1
+     *  [n] => 0
+     *  [s] => 0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cid cchannelId + * @param integer $cldbid clientDbId + * @param integer $permid permId (Default: 0) + * @param string $permsid permName + * @return array permOverview + */ + function permOverview($cid, $cldbid, $permid='0', $permsid=false ) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + if($permsid) { $additional = ' permsid='.$permsid; }else{ $additional = ''; } + + return $this->getData('multi', 'permoverview cid='.$cid.' cldbid='.$cldbid.($permsid == false ? ' permid='.$permid : '').$additional); + } + + /** + * permReset + * + * Restores the default permission settings on the selected virtual server and creates a new initial administrator token. Please note that in case of an error during the permreset call - e.g. when the database has been modified or corrupted - the virtual server will be deleted from the database. + * + * Output: + *
+     * Array
+     * {
+     *  [token] => eKnFZQ9EK7G7MhtuQB6+N2B1PNZZ6OZL3ycDp2OW
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array token + */ + function permReset() { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'permreset'); + } + + /** + * privilegekeyAdd + * + * Create a new token. If tokentype is set to 0, the ID specified with tokenid1 will be a server group ID. Otherwise, tokenid1 is used as a channel group ID and you need to provide a valid channel ID using tokenid2. The tokencustomset parameter allows you to specify a set of custom client properties. This feature can be used when generating tokens to combine a website account database with a TeamSpeak user. The syntax of the value needs to be escaped using the ServerQuery escape patterns and has to follow the general syntax of: + * ident=ident1 value=value1|ident=ident2 value=value2|ident=ident3 value=value3 + * + * Input-Array like this: + *
+     * $customFieldSet = array();
+     *
+     * $customFieldSet['ident'] = 'value';
+     * $customFieldSet['ident'] = 'value';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $tokentype token type + * @param integer $tokenid1 groupID + * @param integer $tokenid2 channelID + * @param string $description token description [optional] + * @param array $customFieldSet customFieldSet [optional] + * @return array tokenInformation + */ + function privilegekeyAdd($tokentype, $tokenid1, $tokenid2, $description ='', $customFieldSet = array()) { + return $this->tokenAdd($tokentype, $tokenid1, $tokenid2, $description, $customFieldSet); + } + + /** + * privilegekeyDelete + * + * Deletes an existing token matching the token key specified with token. + * + * @author Stefan Zehnpfennig + * @param string $token token + * @return boolean success + */ + function privilegekeyDelete($token) { + return $this->tokenDelete($token); + } + + /** + * privilegekeyList + * + * Displays a list of privilege keys available including their type and group IDs. Tokens can be used to gain access to specified server or channel groups. A privilege key is similar to a client with administrator privileges that adds you to a certain permission group, but without the necessity of a such a client with administrator privileges to actually exist. It is a long (random looking) string that can be used as a ticket into a specific server group. + * + * Output: + *
+     * Array
+     * {
+     *  [token] => GdqedxSEDle3e9+LtR3o9dO09bURH+vymvF5hOJg
+     *  [token_type] => 0
+     *  [token_id1] => 71
+     *  [token_id2] => 0
+     *  [token_created] => 1286625908
+     *  [token_description] => for you
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array tokenListist + */ + function privilegekeyList() { + return $this->tokenList(); + } + + /** + * privilegekeyUse + * + * Use a token key gain access to a server or channel group. Please note that the server will automatically delete the token after it has been used. + * + * @author Stefan Zehnpfennig + * @param string $token token + * @return boolean success + */ + function privilegekeyUse($token) { + return $this->tokenUse($token); + } + + /** + * quit closes the connection to host + * + * @author Stefan Zehnpfennig + * @return none + */ + private function quit() { + $this->logout(); + @fputs($this->runtime['socket'], "quit\n"); + @fclose($this->runtime['socket']); + } + /** + * loadQueryData + * + * Loads the query current nickname and current clid + * + * @author toxiicdev (@toxiicdev.net) + */ + private function loadQueryData() + { + $whoAmI = $this->getElement('data', $this->whoAmI()); + $this->runtime['bot_name'] = $whoAmI['client_nickname']; + + $clients = $this->clientList(); + foreach($clients['data'] as $client) + { + if(strstr($this->runtime['bot_name'], $client['client_nickname'])) + { + $this->runtime['bot_clid'] = $client['clid']; + break; + } + } + } + + /** + * selectServer + * + * Selects the virtual server specified with sid or port to allow further interaction. The ServerQuery client will appear on the virtual server and acts like a real TeamSpeak 3 Client, except it's unable to send or receive voice data. If your database contains multiple virtual servers using the same UDP port, use will select a random virtual server using the specified port. + * + * @author Stefan Zehnpfennig + * @param integer $value Port or ID + * @param string $type value type ('port', 'serverId') (default='port') + * @param boolean $virtual set true to add -virtual param [optional] + * @return boolean success + */ + function selectServer($value, $type = 'port', $virtual = false) { + if(in_array($type, array('port', 'serverId'))) { + if($type == 'port') { + if($virtual) { $virtual = ' -virtual'; }else{ $virtual = ''; } + $res = $this->getData('boolean', 'use port='.$value.$virtual); + if($res['success']) { + $this->runtime['selected'] = true; + $this->loadQueryData(); + } + return $res; + }else{ + if($virtual) { $virtual = ' -virtual'; }else{ $virtual = ''; } + $res = $this->getData('boolean', 'use sid='.$value.$virtual); + if($res['success']) { + $this->runtime['selected'] = true; + $this->loadQueryData(); + } + return $res; + } + }else{ + $this->addDebugLog('wrong value type'); + return $this->generateOutput(false, array('Error: wrong value type'), false); + } + } + + /** + * sendMessage + * + * Sends a text message a specified target. The type of the target is determined by targetmode while target specifies the ID of the recipient, whether it be a virtual server, a channel or a client. + * Hint: You can just write to the channel the query client is in. See link in description for details. + * + * Modes: + *
    + *
  • 1: send to client
  • + *
  • 2: send to channel
  • + *
  • 3: send to server
  • + *
+ * Targets: + *
    + *
  • clientID
  • + *
  • channelID
  • + *
  • serverID
  • + *
+ * + * @author Stefan Zehnpfennig + * @param integer $mode + * @param integer $target + * @param string $msg Message + * @see http://forum.teamspeak.com/showthread.php/84280-Sendtextmessage-by-query-client http://forum.teamspeak.com/showthread.php/84280-Sendtextmessage-by-query-client + * @return boolean success + */ + function sendMessage($mode, $target, $msg) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'sendtextmessage targetmode='.$mode.' target='.$target.' msg='.$this->escapeText($msg)); + } + + /** + * serverCreate + * + * Creates a new virtual server using the given properties and displays its ID, port and initial administrator privilege key. If virtualserver_port is not specified, the server will test for the first unused UDP port. The first virtual server will be running on UDP port 9987 by default. Subsequently started virtual servers will be running on increasing UDP port numbers. + * + * Input-Array like this: + *
+     * $data = array();
+     *
+     * $data['setting'] = 'value';
+     * $data['setting'] = 'value';
+     * 
+ * + * Output: + *
+     * Array
+     * {
+     *  [sid] => 2
+     *  [virtualserver_port] => 9988
+     *  [token] => eKnFZQ9EK7G7MhtuQB6+N2B1PNZZ6OZL3ycDp2OW
+     * }
+     * 
+ * + * Possible properties: VIRTUALSERVER_NAME, VIRTUALSERVER_WELCOMEMESSAGE, VIRTUALSERVER_MAXCLIENTS, VIRTUALSERVER_PASSWORD, VIRTUALSERVER_HOSTMESSAGE, VIRTUALSERVER_HOSTMESSAGE_MODE, VIRTUALSERVER_DEFAULT_SERVER_GROUP, VIRTUALSERVER_DEFAULT_CHANNEL_GROUP, VIRTUALSERVER_DEFAULT_CHANNEL_ADMIN_GROUP, VIRTUALSERVER_MAX_DOWNLOAD_TOTAL_BANDWIDTH, VIRTUALSERVER_MAX_UPLOAD_TOTAL_BANDWIDTH, VIRTUALSERVER_HOSTBANNER_URL, VIRTUALSERVER_HOSTBANNER_GFX_URL, VIRTUALSERVER_HOSTBANNER_GFX_INTERVAL, VIRTUALSERVER_COMPLAIN_AUTOBAN_COUNT, VIRTUALSERVER_COMPLAIN_AUTOBAN_TIME, VIRTUALSERVER_COMPLAIN_REMOVE_TIME, VIRTUALSERVER_MIN_CLIENTS_IN_CHANNEL_BEFORE_FORCED_SILENCE, VIRTUALSERVER_PRIORITY_SPEAKER_DIMM_MODIFICATOR, VIRTUALSERVER_ANTIFLOOD_POINTS_TICK_REDUCE, VIRTUALSERVER_ANTIFLOOD_POINTS_NEEDED_COMMAND_BLOCK, VIRTUALSERVER_ANTIFLOOD_POINTS_NEEDED_IP_BLOCK, VIRTUALSERVER_HOSTBANNER_MODE, VIRTUALSERVER_HOSTBUTTON_TOOLTIP, VIRTUALSERVER_HOSTBUTTON_GFX_URL, VIRTUALSERVER_HOSTBUTTON_URL, VIRTUALSERVER_DOWNLOAD_QUOTA, VIRTUALSERVER_UPLOAD_QUOTA, VIRTUALSERVER_MACHINE_ID, VIRTUALSERVER_PORT, VIRTUALSERVER_AUTOSTART, VIRTUALSERVER_STATUS, VIRTUALSERVER_LOG_CLIENT, VIRTUALSERVER_LOG_QUERY, VIRTUALSERVER_LOG_CHANNEL, VIRTUALSERVER_LOG_PERMISSIONS, VIRTUALSERVER_LOG_SERVER, VIRTUALSERVER_LOG_FILETRANSFER, VIRTUALSERVER_MIN_CLIENT_VERSION, VIRTUALSERVER_MIN_ANDROID_VERSION, VIRTUALSERVER_MIN_IOS_VERSION, VIRTUALSERVER_MIN_WINPHONE_VERSION, VIRTUALSERVER_NEEDED_IDENTITY_SECURITY_LEVEL, VIRTUALSERVER_NAME_PHONETIC, VIRTUALSERVER_ICON_ID, VIRTUALSERVER_RESERVED_SLOTS, VIRTUALSERVER_WEBLIST_ENABLED, VIRTUALSERVER_CODEC_ENCRYPTION_MODE + * + * @author Stefan Zehnpfennig + * @param array $data serverSettings [optional] + * @return array serverInfo + */ + function serverCreate($data = array()) { + $settingsString = ''; + + if(count($data) == 0) { $data['virtualserver_name'] = 'Teamspeak 3 Server'; } + + + foreach($data as $key => $value) { + if(!empty($value)) { $settingsString .= ' '.strtolower($key).'='.$this->escapeText($value); } + } + + return $this->getData('array', 'servercreate'.$settingsString); + } + + /** + * serverDelete + * + * Deletes the virtual server specified with sid. Please note that only virtual servers in stopped state can be deleted. + * + * @author Stefan Zehnpfennig + * @param integer $sid serverID + * @return boolean success + */ + function serverDelete($sid) { + $this->serverStop($sid); + return $this->getdata('boolean', 'serverdelete sid='.$sid); + } + + /** + * serverEdit + * + * Changes the selected virtual servers configuration using given properties. Note that this command accepts multiple properties which means that you're able to change all settings of the selected virtual server at once. + * + * Input-Array like this: + *
+     * $data = array();
+     *
+     * $data['setting'] = 'value';
+     * $data['setting'] = 'value';
+     * 
+ * + * Possible properties: Take a look at serverCreate function + * + * @author Stefan Zehnpfennig + * @param array $data serverSettings + * @return boolean success + */ + function serverEdit($data) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + $settingsString = ''; + + foreach($data as $key => $value) { + $settingsString .= ' '.strtolower($key).'='.$this->escapeText($value); + } + + return $this->getData('boolean', 'serveredit'.$settingsString); + } + + /** + * serverGroupAdd + * + * Creates a new server group using the name specified with name and displays its ID. The optional type parameter can be used to create ServerQuery groups and template groups. For detailed information, see + * + * Output: + *
+     * Array
+     * {
+     *  [sgid] => 86
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $name groupName + * @param integer $type groupDbType (0 = template, 1 = normal, 2 = query | Default: 1) + * @return array groupId + */ + function serverGroupAdd($name, $type = 1) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'servergroupadd name='.$this->escapeText($name).' type='.$type); + } + + /** + * serverGroupAddClient + * + * Adds a client to the server group specified with sgid. Please note that a client cannot be added to default groups or template groups. + * + * @author Stefan Zehnpfennig + * @param integer $sgid serverGroupId + * @param integer $cldbid clientDBID + * @return boolean success + */ + function serverGroupAddClient($sgid, $cldbid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'servergroupaddclient sgid='.$sgid.' cldbid='.$cldbid); + } + + /** + * serverGroupAddPerm + * + * Adds a set of specified permissions to the server group specified with sgid. Multiple permissions can be added by providing the four parameters of each permission. A permission can be specified by permid or permsid. + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions['permissionID'] = array('permissionValue', 'permskip', 'permnegated');
+     * //or you could use
+     * $permissions['permissionName'] = array('permissionValue', 'permskip', 'permnegated');
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $sgid serverGroupID + * @param array $permissions permissions + * @return boolean success + */ + function serverGroupAddPerm($sgid, $permissions) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(count($permissions) > 0) { + //Permissions given + + //Errorcollector + $errors = array(); + + //Split Permissions to prevent query from overload + $permissions = array_chunk($permissions, 50, true); + + //Action for each splitted part of permission + foreach($permissions as $permission_part) + { + //Create command_string for each command that we could use implode later + $command_string = array(); + + foreach($permission_part as $key => $value) + { + $command_string[] = (is_numeric($key) ? "permid=" : "permsid=").$this->escapeText($key).' permvalue='.$value[0].' permskip='.$value[1].' permnegated='.$value[2]; + } + + $result = $this->getData('boolean', 'servergroupaddperm sgid='.$sgid.' '.implode('|', $command_string)); + + if(!$result['success']) + { + foreach($result['errors'] as $error) + { + $errors[] = $error; + } + } + } + + if(count($errors) == 0) + { + return $this->generateOutput(true, array(), true); + }else{ + return $this->generateOutput(false, $errors, false); + } + + }else{ + // No permissions given + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + } + + /** + * serverGroupAutoAddPerm + * + * Adds a set of specified permissions to *ALL* regular server groups on all virtual servers. The target groups will be identified by the value of their i_group_auto_update_type permission specified with sgtype. Multiple permissions can be added at once. A permission can be specified by permid or permsid. The known values for sgtype are: 10: Channel Guest 15: Server Guest 20: Query Guest 25: Channel Voice 30: Server Normal 35: Channel Operator 40: Channel Admin 45: Server Admin 50: Query Admin + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions['permissionID'] = array('permissionValue', 'permskip', 'permnegated');
+     * //or you could use
+     * $permissions['permissionName'] = array('permissionValue', 'permskip', 'permnegated');
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $sgtype serverGroupType + * @param array $permissions permissions + * @return boolean success + */ + function serverGroupAutoAddPerm($sgtype, $permissions) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(count($permissions) > 0) { + //Permissions given + + //Errorcollector + $errors = array(); + + //Split Permissions to prevent query from overload + $permissions = array_chunk($permissions, 50, true); + + //Action for each splitted part of permission + foreach($permissions as $permission_part) + { + //Create command_string for each command that we could use implode later + $command_string = array(); + + foreach($permission_part as $key => $value) + { + $command_string[] = (is_numeric($key) ? "permid=" : "permsid=").$this->escapeText($key).' permvalue='.$value[0].' permskip='.$value[1].' permnegated='.$value[2]; + } + + $result = $this->getData('boolean', 'servergroupautoaddperm sgtype='.$sgtype.' '.implode('|', $command_string)); + + if(!$result['success']) + { + foreach($result['errors'] as $error) + { + $errors[] = $error; + } + } + } + + if(count($errors) == 0) + { + return $this->generateOutput(true, array(), true); + }else{ + return $this->generateOutput(false, $errors, false); + } + + }else{ + // No permissions given + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + } + + /** + * serverGroupAutoDeletePerm + * + * Removes a set of specified permissions from *ALL* regular server groups on all virtual servers. The target groups will be identified by the value of their i_group_auto_update_type permission specified with sgtype. Multiple permissions can be removed at once. A permission can be specified by permid or permsid. The known values for sgtype are: 10: Channel Guest 15: Server Guest 20: Query Guest 25: Channel Voice 30: Server Normal 35: Channel Operator 40: Channel Admin 45: Server Admin 50: Query Admin + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions[] = 'permissionID';
+     * //or you could use
+     * $permissions[] = 'permissionName';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $sgtype serverGroupType + * @param array $permissions permissions + * @return boolean success + */ + function serverGroupAutoDeletePerm($sgtype, $permissions) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + $permissionArray = array(); + + if(count($permissions) > 0) { + foreach($permissions AS $value) { + $permissionArray[] = is_numeric($value) ? 'permid='.$value : 'permsid='.$this->escapeText($value); + } + return $this->getData('boolean', 'servergroupautodelperm sgtype='.$sgtype.' '.implode('|', $permissionArray)); + }else{ + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + } + + /** + * serverGroupClientList + * + * Displays the IDs of all clients currently residing in the server group specified with sgid. If you're using the optional -names option, the output will also contain the last known nickname and the unique identifier of the clients. + * + * Possible params: -names + * + * Output: (with -names param) + *
+     * Array
+     * {
+     *  [cldbid] => 2017
+     *  [client_nickname] => Par0noid //with -names parameter
+     *  [client_unique_identifier] => nUixbsq/XakrrmbqU8O30R/D8Gc=
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $sgid groupId + * @param boolean $names set true to add -names param [optional] + * @return multidimensional-array serverGroupClientList + */ + function serverGroupClientList($sgid, $names = false) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + if($names) { $names = ' -names'; }else{ $names = ''; } + return $this->getData('multi', 'servergroupclientlist sgid='.$sgid.$names); + } + + /** + * serverGroupCopy + * + * Creates a copy of the server group specified with ssgid. If tsgid is set to 0, the server will create a new group. To overwrite an existing group, simply set tsgid to the ID of a designated target group. If a target group is set, the name parameter will be ignored. + * + * Output: + *
+     * Array
+     * {
+     *  [sgid] => 86
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $ssgid sourceGroupID + * @param integer $tsgid targetGroupID + * @param integer $name groupName + * @param integer $type groupDbType (0 = template, 1 = normal, 2 = query | Default: 1) + * @return array groupId + */ + function serverGroupCopy($ssgid, $tsgid, $name, $type = 1) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'servergroupcopy ssgid='.$ssgid.' tsgid='.$tsgid.' name='.$this->escapeText($name).' type='.$type); + } + + /** + * serverGroupDelete + * + * Deletes the server group specified with sgid. If force is set to 1, the server group will be deleted even if there are clients within. + * + * @author Stefan Zehnpfennig + * @param integer $sgid serverGroupID + * @param integer $force forces deleting group (Default: 1) + * @return boolean success + */ + function serverGroupDelete($sgid, $force = 1) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'servergroupdel sgid='.$sgid.' force='.$force); + } + + /** + * serverGroupDeleteClient + * + * Removes a client specified with cldbid from the server group specified with sgid. + * + * @author Stefan Zehnpfennig + * @param integer $sgid groupID + * @param integer $cldbid clientDBID + * @return boolean success + */ + function serverGroupDeleteClient($sgid, $cldbid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'servergroupdelclient sgid='.$sgid.' cldbid='.$cldbid); + } + + /** + * serverGroupDeletePerm + * + * Removes a set of specified permissions from the server group specified with sgid. Multiple permissions can be removed at once. A permission can be specified by permid or permsid. + * + * Input-Array like this: + *
+     * $permissions = array();
+     * $permissions[] = 'permissionID';
+     * //or you could use
+     * $permissions[] = 'permissionName';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $sgid serverGroupID + * @param array $permissionIds permissionIds + * @return boolean success + */ + function serverGroupDeletePerm($sgid, $permissionIds) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + $permissionArray = array(); + + if(count($permissionIds) > 0) { + foreach($permissionIds AS $value) { + $permissionArray[] = is_numeric($value) ? 'permid='.$value : 'permsid='.$this->escapeText($value); + } + return $this->getData('boolean', 'servergroupdelperm sgid='.$sgid.' '.implode('|', $permissionArray)); + }else{ + $this->addDebugLog('no permissions given'); + return $this->generateOutput(false, array('Error: no permissions given'), false); + } + } + + /** + * serverGroupList + * + * Displays a list of server groups available. Depending on your permissions, the output may also contain global ServerQuery groups and template groups. + * + * Output: + *
+     * Array
+     * {
+     *  [sgid] => 1
+     *  [name] => Guest Server Query
+     *  [type] => 2
+     *  [iconid] => 0
+     *  [savedb] => 0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array serverGroupList + */ + function serverGroupList() { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'servergrouplist'); + } + + /** + * serverGroupPermList + * + * Displays a list of permissions assigned to the server group specified with sgid. If the permsid option is specified, the output will contain the permission names instead of the internal IDs. + * + * Output: + *
+     * Array
+     * {
+     *  [permid] => 12876 (if permsid = false)
+     *  [permsid] => b_client_info_view (if permsid = true)
+     *  [permvalue] => 1
+     *  [permnegated] => 0
+     *  [permskip] => 0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $sgid serverGroupID + * @param boolean $permsid set true to add -permsid param [optional] + * @return array serverGroupPermList + */ + function serverGroupPermList($sgid, $permsid = false) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + if($permsid) { $additional = ' -permsid'; }else{ $additional = ''; } + return $this->getData('multi', 'servergrouppermlist sgid='.$sgid.$additional); + } + + /** + * serverGroupRename + * + * Changes the name of the server group specified with sgid. + * + * @author Stefan Zehnpfennig + * @param integer $sgid serverGroupID + * @param integer $name groupName + * @return boolean success + */ + function serverGroupRename($sgid, $name) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'servergrouprename sgid='.$sgid.' name='.$this->escapeText($name)); + } + + /** + * serverGroupsByClientID + * + * Displays all server groups the client specified with cldbid is currently residing in. + * + * Output: + *
+     * Array
+     * {
+     *  [name] => Guest
+     *  [sgid] => 73
+     *  [cldbid] => 2
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $cldbid clientDBID + * @return array serverGroupsByClientId + */ + function serverGroupsByClientID($cldbid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'servergroupsbyclientid cldbid='.$cldbid); + } + + /** + * serverIdGetByPort + * + * Displays the database ID of the virtual server running on the UDP port specified by virtualserver_port. + * + * Output: + *
+     * Array
+     * {
+     *  [server_id] => 1
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $port serverPort + * @return array serverInfo + */ + function serverIdGetByPort($port) { + return $this->getData('array', 'serveridgetbyport virtualserver_port='.$port); + } + + /** + * serverInfo + * + * Displays detailed configuration information about the selected virtual server including unique ID, number of clients online, configuration, etc. + * + * Output: + *
+     * Array
+     * {
+     *  [virtualserver_unique_identifier] => 1GvKR12fg/mY75flwN/u7pn7KIs=
+     *  [virtualserver_name] => TeamSpeak ]I[ Server
+     *  [virtualserver_welcomemessage] => Welcome to TeamSpeak, check [URL]www.teamspeak.com[/URL] for latest information
+     *  [virtualserver_platform] => Windows
+     *  [virtualserver_version] => 3.0.12.4 [Build: 1461597405]
+     *  [virtualserver_maxclients] => 32
+     *  [virtualserver_password] =>
+     *  [virtualserver_clientsonline] => 2
+     *  [virtualserver_channelsonline] => 1
+     *  [virtualserver_created] => 0
+     *  [virtualserver_uptime] => 6517
+     *  [virtualserver_codec_encryption_mode] => 0
+     *  [virtualserver_hostmessage] =>
+     *  [virtualserver_hostmessage_mode] => 0
+     *  [virtualserver_filebase] => files\\virtualserver_1
+     *  [virtualserver_default_server_group] => 11
+     *  [virtualserver_default_channel_group] => 12
+     *  [virtualserver_flag_password] => 0
+     *  [virtualserver_default_channel_admin_group] => 9
+     *  [virtualserver_max_download_total_bandwidth] => 18446744073709551615
+     *  [virtualserver_max_upload_total_bandwidth] => 18446744073709551615
+     *  [virtualserver_hostbanner_url] =>
+     *  [virtualserver_hostbanner_gfx_url] =>
+     *  [virtualserver_hostbanner_gfx_interval] => 0
+     *  [virtualserver_complain_autoban_count] => 5
+     *  [virtualserver_complain_autoban_time] => 1200
+     *  [virtualserver_complain_remove_time] => 3600
+     *  [virtualserver_min_clients_in_channel_before_forced_silence] => 100
+     *  [virtualserver_priority_speaker_dimm_modificator] => -18.0000
+     *  [virtualserver_id] => 1
+     *  [virtualserver_antiflood_points_tick_reduce] => 5
+     *  [virtualserver_antiflood_points_needed_command_block] => 150
+     *  [virtualserver_antiflood_points_needed_ip_block] => 250
+     *  [virtualserver_client_connections] => 1
+     *  [virtualserver_query_client_connections] => 54
+     *  [virtualserver_hostbutton_tooltip] =>
+     *  [virtualserver_hostbutton_url] =>
+     *  [virtualserver_hostbutton_gfx_url] =>
+     *  [virtualserver_queryclientsonline] => 1
+     *  [virtualserver_download_quota] => 18446744073709551615
+     *  [virtualserver_upload_quota] => 18446744073709551615
+     *  [virtualserver_month_bytes_downloaded] => 0
+     *  [virtualserver_month_bytes_uploaded] => 16045
+     *  [virtualserver_total_bytes_downloaded] => 0
+     *  [virtualserver_total_bytes_uploaded] => 16045
+     *  [virtualserver_port] => 9987
+     *  [virtualserver_autostart] => 1
+     *  [virtualserver_machine_id] =>
+     *  [virtualserver_needed_identity_security_level] => 8
+     *  [virtualserver_log_client] => 0
+     *  [virtualserver_log_query] => 0
+     *  [virtualserver_log_channel] => 0
+     *  [virtualserver_log_permissions] => 1
+     *  [virtualserver_log_server] => 0
+     *  [virtualserver_log_filetransfer] => 0
+     *  [virtualserver_min_client_version] => 1445512488
+     *  [virtualserver_name_phonetic] =>
+     *  [virtualserver_icon_id] => 0
+     *  [virtualserver_reserved_slots] => 0
+     *  [virtualserver_total_packetloss_speech] => 0.0000
+     *  [virtualserver_total_packetloss_keepalive] => 0.0000
+     *  [virtualserver_total_packetloss_control] => 0.0000
+     *  [virtualserver_total_packetloss_total] => 0.0000
+     *  [virtualserver_total_ping] => 0.0000
+     *  [virtualserver_ip] =>
+     *  [virtualserver_weblist_enabled] => 1
+     *  [virtualserver_ask_for_privilegekey] => 0
+     *  [virtualserver_hostbanner_mode] => 0
+     *  [virtualserver_channel_temp_delete_delay_default] => 0
+     *  [virtualserver_min_android_version] => 1407159763
+     *  [virtualserver_min_ios_version] => 1407159763
+     *  [virtualserver_status] => online
+     *  [connection_filetransfer_bandwidth_sent] => 0
+     *  [connection_filetransfer_bandwidth_received] => 0
+     *  [connection_filetransfer_bytes_sent_total] => 0
+     *  [connection_filetransfer_bytes_received_total] => 0
+     *  [connection_packets_sent_speech] => 0
+     *  [connection_bytes_sent_speech] => 0
+     *  [connection_packets_received_speech] => 0
+     *  [connection_bytes_received_speech] => 0
+     *  [connection_packets_sent_keepalive] => 12959
+     *  [connection_bytes_sent_keepalive] => 531319
+     *  [connection_packets_received_keepalive] => 12959
+     *  [connection_bytes_received_keepalive] => 544277
+     *  [connection_packets_sent_control] => 396
+     *  [connection_bytes_sent_control] => 65555
+     *  [connection_packets_received_control] => 397
+     *  [connection_bytes_received_control] => 44930
+     *  [connection_packets_sent_total] => 13355
+     *  [connection_bytes_sent_total] => 596874
+     *  [connection_packets_received_total] => 13356
+     *  [connection_bytes_received_total] => 589207
+     *  [connection_bandwidth_sent_last_second_total] => 81
+     *  [connection_bandwidth_sent_last_minute_total] => 92
+     *  [connection_bandwidth_received_last_second_total] => 83
+     *  [connection_bandwidth_received_last_minute_total] => 88
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array serverInformation + */ + function serverInfo() { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'serverinfo'); + } + + /** + * serverList + * + * Displays a list of virtual servers including their ID, status, number of clients online, etc. If you're using the -all option, the server will list all virtual servers stored in the database. This can be useful when multiple server instances with different machine IDs are using the same database. The machine ID is used to identify the server instance a virtual server is associated with. The status of a virtual server can be either online, offline, deploy running, booting up, shutting down and virtual online. While most of them are self-explanatory, virtual online is a bit more complicated. Please note that whenever you select a virtual server which is currently stopped, it will be started in virtual mode which means you are able to change its configuration, create channels or change permissions, but no regular TeamSpeak 3 Client can connect. As soon as the last ServerQuery client deselects the virtual server, its status will be changed back to offline. + * + * Possible params: [-uid] [-short] [-all] [-onlyoffline] + * + * Output: + *
+     * Array
+     * {
+     *  [virtualserver_id] => 1 //displayed on -short
+     *  [virtualserver_port] => 9987 //displayed on -short
+     *  [virtualserver_status] => online //displayed on -short
+     *  [virtualserver_clientsonline] => 2
+     *  [virtualserver_queryclientsonline] => 1
+     *  [virtualserver_maxclients] => 32
+     *  [virtualserver_uptime] => 3045
+     *  [virtualserver_name] => TeamSpeak ]I[ Server
+     *  [virtualserver_autostart] => 1
+     *  [virtualserver_machine_id] =>
+     *  [-uid] => [virtualserver_unique_identifier] => bYrybKl/APfKq7xzpIJ1Xb6C06U=
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $options optional parameters + * @return array serverList + */ + function serverList($options = NULL) { + return $this->getData('multi', 'serverlist'.(!empty($options) ? ' '.$options : '')); + } + + /** + * serverProcessStop + * + * Stops the entire TeamSpeak 3 Server instance by shutting down the process. + * + * @author Stefan Zehnpfennig + * @return boolean success + */ + function serverProcessStop() { + return $this->getData('boolean', 'serverprocessstop'); + } + + /** + * serverRequestConnectionInfo + * + * Displays detailed connection information about the selected virtual server including uptime, traffic information, etc. + * + * Output: + *
+     * Array
+     * {
+     *  [connection_filetransfer_bandwidth_sent] => 0
+     *  [connection_filetransfer_bandwidth_received] => 0
+     *  [connection_filetransfer_bytes_sent_total] => 0
+     *  [connection_filetransfer_bytes_received_total] => 0
+     *  [connection_packets_sent_total] => 3333
+     *  [connection_bytes_sent_total] => 149687
+     *  [connection_packets_received_total] => 3333
+     *  [connection_bytes_received_total] => 147653
+     *  [connection_bandwidth_sent_last_second_total] => 123
+     *  [connection_bandwidth_sent_last_minute_total] => 81
+     *  [connection_bandwidth_received_last_second_total] => 352
+     *  [connection_bandwidth_received_last_minute_total] => 87
+     *  [connection_connected_time] => 3387
+     *  [connection_packetloss_total] => 0.0000
+     *  [connection_ping] => 0.0000
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array serverRequestConnectionInfo + */ + function serverRequestConnectionInfo() { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('array', 'serverrequestconnectioninfo'); + } + + /** + * serverSnapshotCreate + * + * Displays a snapshot of the selected virtual server containing all settings, groups and known client identities. The data from a server snapshot can be used to restore a virtual servers configuration, channels and permissions using the serversnapshotdeploy command. + * + * @author Stefan Zehnpfennig + * @return string snapshot + */ + function serverSnapshotCreate() { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('plain', 'serversnapshotcreate'); + } + + /** + * serverSnapshotDeploy + * + * Restores the selected virtual servers configuration using the data from a previously created server snapshot. Please note that the TeamSpeak 3 Server does NOT check for necessary permissions while deploying a snapshot so the command could be abused to gain additional privileges. + * + * + added "-mapping" to the serversnapshotdeploy command. This optional parameters will add a mapping of the old and new channelid's in the return + * + * @author Stefan Zehnpfennig + * @param string $snapshot snapshot + * @param bool $mapping mapping [optional] + * @return boolean success + */ + function serverSnapshotDeploy($snapshot, $mapping = false) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'serversnapshotdeploy '.($mapping ? '-mapping ' : '').$snapshot); + } + + /** + * serverStart + * + * Starts the virtual server specified with sid. Depending on your permissions, you're able to start either your own virtual server only or all virtual servers in the server instance. + * + * @author Stefan Zehnpfennig + * @param integer $sid serverID + * @return boolean success + */ + function serverStart($sid) { + return $this->getdata('boolean', 'serverstart sid='.$sid); + } + + /** + * serverStop + * + * Stops the virtual server specified with sid. Depending on your permissions, you're able to stop either your own virtual server only or all virtual servers in the server instance. + * + * @author Stefan Zehnpfennig + * @param integer $sid serverID + * @return boolean success + */ + function serverStop($sid) { + return $this->getdata('boolean', 'serverstop sid='.$sid); + } + + /** + * serverTemppasswordAdd + * + * Sets a new temporary server password specified with pw. The temporary password will be valid for the number of seconds specified with duration. The client connecting with this password will automatically join the channel specified with tcid. If tcid is set to 0, the client will join the default channel. + * + * @author Stefan Zehnpfennig + * @param string $pw temporary password + * @param string $duration durations in seconds + * @param string $desc description [optional] + * @param string $tcid cid user enters on connect (0 = Default channel) [optional] + * @param string $tcpw channelPW + * @return boolean success + */ + function serverTempPasswordAdd($pw, $duration, $desc = 'none', $tcid = 0, $tcpw = null) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getdata('boolean', 'servertemppasswordadd pw='.$this->escapeText($pw).' desc='.(!empty($desc) ? $this->escapeText($desc) : 'none').' duration='.$duration.' tcid='.$tcid.(!empty($tcpw) ? ' tcpw='.$this->escapeText($tcpw) : '')); + } + + /** + * serverTemppasswordDel + * + * Deletes the temporary server password specified with pw. + * + * @author Stefan Zehnpfennig + * @param string $pw temporary password + * @return boolean success + */ + function serverTempPasswordDel($pw) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getdata('boolean', 'servertemppassworddel pw='.$this->escapeText($pw)); + } + + /** + * serverTemppasswordList + * + * Returns a list of active temporary server passwords. The output contains the clear-text password, the nickname and unique identifier of the creating client. + * + * Output: + *
+     * Array
+     * {
+     *  [nickname] => serveradmin
+     *  [uid] => 1
+     *  [desc] => none
+     *  [pw_clear] => test
+     *  [start] => 1334996838
+     *  [end] => 1335000438
+     *  [tcid] => 0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array serverTemppasswordList + */ + function serverTempPasswordList() { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('multi', 'servertemppasswordlist'); + } + + + /** + * setClientChannelGroup + * + * Sets the channel group of a client to the ID specified with cgid. + * + * @author Stefan Zehnpfennig + * @param integer $cgid groupID + * @param integer $cid channelID + * @param integer $cldbid clientDBID + * @return boolean success + */ + function setClientChannelGroup($cgid, $cid, $cldbid) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'setclientchannelgroup cgid='.$cgid.' cid='.$cid.' cldbid='.$cldbid); + } + + /** + * setName + * + * Sets your nickname in server query + * + * @author Stefan Zehnpfennig + * @param string $newName new name in server query + * @return boolean success + */ + function setName($newName) { + return $this->getData('boolean', 'clientupdate client_nickname='.$this->escapeText($newName)); + } + + /** + * tokenAdd + * + * Create a new token. If tokentype is set to 0, the ID specified with tokenid1 will be a server group ID. Otherwise, tokenid1 is used as a channel group ID and you need to provide a valid channel ID using tokenid2. The tokencustomset parameter allows you to specify a set of custom client properties. This feature can be used when generating tokens to combine a website account database with a TeamSpeak user. The syntax of the value needs to be escaped using the ServerQuery escape patterns and has to follow the general syntax of: + * ident=ident1 value=value1|ident=ident2 value=value2|ident=ident3 value=value3 + * + * Input-Array like this: + *
+     * $customFieldSet = array();
+     *
+     * $customFieldSet['ident'] = 'value';
+     * $customFieldSet['ident'] = 'value';
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $tokentype token type + * @param integer $tokenid1 groupID + * @param integer $tokenid2 channelID + * @param string $description token description [optional] + * @param array $customFieldSet customFieldSet [optional] + * @return array tokenInformation + */ + function tokenAdd($tokentype, $tokenid1, $tokenid2, $description ='', $customFieldSet = array()) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if(!empty($description)) { $description = ' tokendescription=' . $this->escapeText($description); } + + if($tokentype == '0') { $tokenid2 = '0'; } + + if(count($customFieldSet)) { + $settingsString = array(); + + foreach($customFieldSet as $key => $value) { + $settingsString[] = 'ident='.$this->escapeText($key).'\svalue='.$this->escapeText($value); + } + + $customFieldSet = ' tokencustomset='.implode('\p', $settingsString); + }else{ + $customFieldSet = ''; + } + + return $this->getData('array', 'privilegekeyadd tokentype='.$tokentype.' tokenid1='.$tokenid1.' tokenid2='.$tokenid2.$description.$customFieldSet); + } + + /** + * tokenDelete + * + * Deletes an existing token matching the token key specified with token. + * + * @author Stefan Zehnpfennig + * @param string $token token + * @return boolean success + */ + function tokenDelete($token) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'privilegekeydelete token='.$token); + } + + /** + * tokenList + * + * Displays a list of privilege keys available including their type and group IDs. Tokens can be used to gain access to specified server or channel groups. A privilege key is similar to a client with administrator privileges that adds you to a certain permission group, but without the necessity of a such a client with administrator privileges to actually exist. It is a long (random looking) string that can be used as a ticket into a specific server group. + * + * Output: + *
+     * Array
+     * {
+     *  [token] => GdqedxSEDle3e9+LtR3o9dO09bURH+vymvF5hOJg
+     *  [token_type] => 0
+     *  [token_id1] => 71
+     *  [token_id2] => 0
+     *  [token_created] => 1286625908
+     *  [token_description] => for you
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array tokenListist + */ + function tokenList() { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + return $this->getData('multi', 'privilegekeylist'); + } + + /** + * tokenUse + * + * Use a token key gain access to a server or channel group. Please note that the server will automatically delete the token after it has been used. + * + * @author Stefan Zehnpfennig + * @param string $token token + * @return boolean success + */ + function tokenUse($token) { + if(!$this->runtime['selected']) { return $this->checkSelected(); } + return $this->getData('boolean', 'privilegekeyuse token='.$token); + } + + /** + * version + * + * Displays the servers version information including platform and build number. + * + * Output: + *
+     * Array
+     * {
+     *  [version] => 3.0.6.1
+     *  [build] => 1340956745
+     *  [platform] => Windows
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array versionInformation + */ + function version() { + return $this->getData('array', 'version'); + } + + /** + * whoAmI + * + * Displays information about your current ServerQuery connection including your loginname, etc. + * + * Output: + *
+     * Array
+     * {
+     *  [virtualserver_status] => online
+     *  [virtualserver_id] => 1
+     *  [virtualserver_unique_identifier] => bYrybKl/APfKq7xzpIJ1Xb6C06U=
+     *  [virtualserver_port] => 9987
+     *  [client_id] => 5
+     *  [client_channel_id] => 1
+     *  [client_nickname] => serveradmin from 127.0.0.1:15208
+     *  [client_database_id] => 1
+     *  [client_login_name] => serveradmin
+     *  [client_unique_identifier] => serveradmin
+     *  [client_origin_server_id] => 0
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array clientinformation + */ + function whoAmI() { + return $this->getData('array', 'whoami'); + } + +//******************************************************************************************* +//************************************ Helper Functions ************************************ +//******************************************************************************************* + + /** + * checkSelected throws out 2 errors + * + * Output: + *
+     * Array
+     * {
+     *  [success] => false
+     *  [errors] => Array
+     *  [data] => false
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array error + */ + private function checkSelected() { + $backtrace = debug_backtrace(); + $this->addDebugLog('you can\'t use this function if no server is selected', $backtrace[1]['function'], $backtrace[0]['line']); + return $this->generateOutput(false, array('you can\'t use this function if no server is selected'), false); + } + + /** + * convertSecondsToStrTime + * + * Converts seconds to a strTime (bsp. 5d 1h 23m 19s) + * + * @author Stefan Zehnpfennig + * @param integer $seconds time in seconds + * @return string strTime + */ + public function convertSecondsToStrTime($seconds) { + $conv_time = $this->convertSecondsToArrayTime($seconds); + return $conv_time['days'].'d '.$conv_time['hours'].'h '.$conv_time['minutes'].'m '.$conv_time['seconds'].'s'; + } + + /** + * convertSecondsToArrayTime + * + * Converts seconds to a array: time + * + * Output: + *
+     * Array
+     * {
+     *  [days] => 3
+     *  [hours] => 9
+     *  [minutes] => 45
+     *  [seconds] => 17
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param integer $seconds time in seconds + * @return array time + */ + public function convertSecondsToArrayTime($seconds) { + $conv_time = array(); + $conv_time['days']=floor($seconds / 86400); + $conv_time['hours']=floor(($seconds - ($conv_time['days'] * 86400)) / 3600); + $conv_time['minutes']=floor(($seconds - (($conv_time['days'] * 86400)+($conv_time['hours']*3600))) / 60); + $conv_time['seconds']=floor(($seconds - (($conv_time['days'] * 86400)+($conv_time['hours']*3600)+($conv_time['minutes'] * 60)))); + return $conv_time; + } + + /** + * getElement + * + * Returns the given associated element from an array + * This can be used to get a result in a one line operation + * + * For example you got this array: + *
+     * Array
+     * {
+     *  [success] => false
+     *  [errors] => Array
+     *  [data] => false
+     * }
+     * 
+ * Now you can grab the element like this: + *
+     * $ts = new ts3admin('***', '***');
+     *
+     * if($ts->getElement('success', $ts->connect())) {
+     *  //operation
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param string $element key of element + * @param array $array array + * @return mixed + */ + public function getElement($element, $array) { + return $array[$element]; + } + + /** + * succeeded + * + * Succeeded will check the success element of a return array + *
+     * $ts = new ts3admin('***', '***');
+     *
+     * if($ts->succeeded($ts->connect())) {
+     *  //operation
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @param array $array result + * @return boolean + */ + public function succeeded($array) { + if(isset($array['success'])) { + return $array['success']; + }else{ + return false; + } + } + + + +//******************************************************************************************* +//*********************************** Internal Functions ************************************ +//******************************************************************************************* + + /** + * __construct + * + * Note: When specifying a numerical IPv6 address (e.g. fe80::1), you must enclose the IP in square brackets—for example, [fe80::1] + * + * @author Stefan Zehnpfennig + * @param string $host ts3host + * @param integer $queryport ts3queryport + * @param integer $timeout socket timeout (default = 2) [optional] + * @return void + */ + function __construct($host, $queryport, $timeout = 2) { + if($queryport >= 1 and $queryport <= 65536) { + if($timeout >= 1) { + $this->runtime['host'] = $host; + $this->runtime['queryport'] = $queryport; + $this->runtime['timeout'] = $timeout; + }else{ + $this->addDebugLog('invalid timeout value'); + } + }else{ + $this->addDebugLog('invalid queryport'); + } + } + + /** + * __destruct + * + * @author Stefan Zehnpfennig + * @return void + */ + function __destruct() { + $this->quit(); + } + + /** + * __call + * + * prevents your website from php errors if you want to execute a method which doesn't exists + * + * @author Stefan Zehnpfennig + * @param string $name method name + * @param array $args method arguments + * @return void + */ + function __call($name, $args) { + $this->addDebugLog('Method '.$name.' doesn\'t exist', $name, 0); + return $this->generateOutput(false, array('Method '.$name.' doesn\'t exist'), false); + } + + /** + * isConnected + * + * Checks if the connection is established + * + * @author Stefan Zehnpfennig + * @return boolean connected + */ + private function isConnected() { + return !empty($this->runtime['socket']); + } + + /** + * generateOutput + * + * Builds a method return as array + * + * @author Stefan Zehnpfennig + * @param boolean $success true/false + * @param array $errors all errors which occured while executing a method + * @param mixed $data parsed data from server + * @return array output + */ + private function generateOutput($success, $errors, $data) { + return array('success' => $success, 'errors' => $errors, 'data' => $data); + } + + /** + * unEscapeText + * + * Turns escaped chars to normals + * + * @author Stefan Zehnpfennig + * @param string $text text which should be escaped + * @return string text + */ + private function unEscapeText($text) { + $escapedChars = array("\t", "\v", "\r", "\n", "\f", "\s", "\p", "\/"); + $unEscapedChars = array('', '', '', '', '', ' ', '|', '/'); + $text = str_replace($escapedChars, $unEscapedChars, $text); + return $text; + } + + /** + * escapeText + * + * Escapes chars that we can use it in the query + * + * @author Stefan Zehnpfennig + * @param string $text text which should be escaped + * @return string text + */ + private function escapeText($text) { + $text = str_replace("\t", '\t', $text); + $text = str_replace("\v", '\v', $text); + $text = str_replace("\r", '\r', $text); + $text = str_replace("\n", '\n', $text); + $text = str_replace("\f", '\f', $text); + $text = str_replace(' ', '\s', $text); + $text = str_replace('|', '\p', $text); + $text = str_replace('/', '\/', $text); + return $text; + } + + /** + * splitBanIds + * + * Splits banIds to array + * + * @author Stefan Zehnpfennig + * @param string $text plain text server response + * @return string text + */ + private function splitBanIds($text) { + $data = array(); + $text = str_replace(array("\n", "\r"), '', $text); + $ids = explode("banid=", $text); + unset($ids[0]); + return $ids; + } + +//******************************************************************************************* +//************************************ Network Functions ************************************ +//******************************************************************************************* + + /** + * connect + * + * Connects to a ts3instance query port + * + * @author Stefan Zehnpfennig + * @return boolean success + */ + function connect() { + if($this->isConnected()) { + $this->addDebugLog('Error: you are already connected!'); + return $this->generateOutput(false, array('Error: the script is already connected!'), false); + } + + $socket = @fsockopen($this->runtime['host'], $this->runtime['queryport'], $errnum, $errstr, $this->runtime['timeout']); + + if(!$socket) + { + $this->addDebugLog('Error: connection failed!'); + return $this->generateOutput(false, array('Error: connection failed!', 'Server returns: '.$errstr), false); + } + else + { + $prefix = fgets($socket); + if(strpos($prefix, 'TS3') !== false || strpos($prefix, 'TeaSpeak') !== false) + { + $tmpVar = fgets($socket, 1024); + $this->runtime['socket'] = $socket; + return $this->generateOutput(true, array(), true); + } + else + { + $this->addDebugLog('host isn\'t a ts3 instance!'); + return $this->generateOutput(false, array('Error: host isn\'t a ts3 instance!'), false); + } + } + } + + /** + * getQueryClid + * + * Returns the server query client id + * + * @author toxiicdev (@toxiicdev.net) + * @return int value + */ + + public function getQueryClid() + { + return $this->runtime['bot_clid']; + } + + /** + * executeCommand + * + * Executes a command and fetches the response + * + * @author Stefan Zehnpfennig + * @param string $command command which should be executed + * @param array $tracert array with information from first exec + * @return mixed data + */ + private function executeCommand($command, $tracert = null) { + if(!$this->isConnected()) { + $this->addDebugLog('script isn\'t connected to server', $tracert[1]['function'], $tracert[0]['line']); + return $this->generateOutput(false, array('Error: script isn\'t connected to server'), false); + } + + $data = ''; + + $splittedCommand = str_split($command, 1024); + $splittedCommand[(count($splittedCommand) - 1)] .= "\n"; + + foreach($splittedCommand as $commandPart) + { + if(!(@fputs($this->runtime['socket'], $commandPart))) + { + $this->runtime['socket'] = $this->runtime['bot_clid'] = ''; + $this->addDebugLog('Socket closed.', $tracert[1]['function'], $tracert[0]['line']); + return $this->generateOutput(false, array('Socket closed.'), false); + } + } + do { + $data .= @fgets($this->runtime['socket'], 4096); + + if(empty($data)) + { + $this->runtime['socket'] = $this->runtime['bot_clid'] = ''; + $this->addDebugLog('Socket closed.', $tracert[1]['function'], $tracert[0]['line']); + return $this->generateOutput(false, array('Socket closed.'), false); + } + else if(strpos($data, 'error id=3329 msg=connection') !== false) { + $this->runtime['socket'] = $this->runtime['bot_clid'] = ''; + $this->addDebugLog('You got banned from server. Socket closed.', $tracert[1]['function'], $tracert[0]['line']); + return $this->generateOutput(false, array('You got banned from server. Connection closed.'), false); + } + + } while(strpos($data, 'msg=') === false or strpos($data, 'error id=') === false); + + if(strpos($data, 'error id=0 msg=ok') === false) { + $splittedResponse = explode('error id=', $data); + $chooseEnd = count($splittedResponse) - 1; + + $cutIdAndMsg = explode(' msg=', $splittedResponse[$chooseEnd]); + + if($tracert != null) + $this->addDebugLog('ErrorID: '.$cutIdAndMsg[0].' | Message: '.$this->unEscapeText($cutIdAndMsg[1]), $tracert[1]['function'], $tracert[0]['line']); + + return $this->generateOutput(false, array('ErrorID: '.$cutIdAndMsg[0].' | Message: '.$this->unEscapeText($cutIdAndMsg[1])), false); + }else{ + return $this->generateOutput(true, array(), $data); + } + } + + /** + * readChatMessage + * + * Read chat message by its type (Result: http://bit.ly/2dtBXnT) + * + * IMPORTANT: Check always for message success, sometimes you can get an empty message + * and it will return empty data + * + * Output: + *
+     * Array
+     * {
+     *		[invokerid] => 37
+     *		[invokeruid] => /jl8QCHJWrHDKXgVtF+9FX7zg1E=
+     *		[invokername] => toxiicdev.net
+     *		[msg] => It's just a prank bro
+     *		[targetmode] => 3
+     * }
+     * 
+ * @author toxiicdev (@toxiicdev.net) + * @param string $type textserver|textchannel|textprivate + * @param boolean $keepalive default false + * @param int $cid channel id (required only for textchannel) + * @return array data + */ + public function readChatMessage($type = 'textchannel', $keepalive = false, $cid = -1) + { + $availTypes = array('textserver', 'textchannel', 'textprivate'); + $rtnData = array('success' => 0, 'data' => array('invokerid' => '', 'invokeruid' => '', 'invokername' => '', 'msg' => '', 'targetmode' => '')); + + if(!$this->isConnected()) { + $this->addDebugLog('script isn\'t connected to server', $tracert[1]['function'], $tracert[0]['line']); + return $rtnData; + } + + if(!in_array($type, $availTypes)) { + $this->addDebugLog('Invalid passed read type', $tracert[1]['function'], $tracert[0]['line']); + return $rtnData; + } + + if(!$this->runtime['selected']) { return $this->checkSelected(); } + + if($type == 'textchannel') + { + $this->clientMove($this->getQueryClid(), $cid); + } + + $this->executeCommand("servernotifyregister event=$type" . ($cid != -1 ? " id=$cid" : "") , null); + + $data = fgets($this->runtime['socket'], 4096); + + if(!empty($data)) + { + $rtnData['success'] = 1; + $msgData = explode(" ", $data); + foreach($msgData as $param) + { + $paramData = explode("=", $param); + if(array_key_exists($paramData[0], $rtnData['data'])) + { + $rtnData['data'][$paramData[0]] = $this->unescapeText(implode("=", array_slice($paramData, 1, count($paramData) -1))); + } + } + } + if(!$keepalive) $this->serverNotifyUnregister(); + + return $rtnData; + } + /** + * serverNotifyUnregister + * + * Unregisters server notify event + * + * @author toxiicdev (@toxiicdev.net) + */ + public function serverNotifyUnregister() + { + $this->executeCommand("servernotifyunregister", null); + } + /** + * getData + * + * Parses data from query and returns an array + * + * @author Stefan Zehnpfennig + * @access private + * @param string $mode select return mode ('boolean', 'array', 'multi', 'plain') + * @param string $command command which should be executed + * @return mixed data + */ + private function getData($mode, $command) { + + $validModes = array('boolean', 'array', 'multi', 'plain'); + + if(!in_array($mode, $validModes)) { + $this->addDebugLog($mode.' is an invalid mode'); + return $this->generateOutput(false, array('Error: '.$mode.' is an invalid mode'), false); + } + + if(empty($command)) { + $this->addDebugLog('you have to enter a command'); + return $this->generateOutput(false, array('Error: you have to enter a command'), false); + } + + $fetchData = $this->executeCommand($command, debug_backtrace()); + + + $fetchData['data'] = str_replace(array('error id=0 msg=ok', chr('01')), '', $fetchData['data']); + + + if($fetchData['success']) { + if($mode == 'boolean') { + return $this->generateOutput(true, array(), true); + } + + if($mode == 'array') { + if(empty($fetchData['data'])) { return $this->generateOutput(true, array(), array()); } + $datasets = explode(' ', $fetchData['data']); + + $output = array(); + + foreach($datasets as $dataset) { + $dataset = explode('=', $dataset); + + if(count($dataset) > 2) { + for($i = 2; $i < count($dataset); $i++) { + $dataset[1] .= '='.$dataset[$i]; + } + $output[$this->unEscapeText($dataset[0])] = $this->unEscapeText($dataset[1]); + }else{ + if(count($dataset) == 1) { + $output[$this->unEscapeText($dataset[0])] = ''; + }else{ + $output[$this->unEscapeText($dataset[0])] = $this->unEscapeText($dataset[1]); + } + + } + } + return $this->generateOutput(true, array(), $output); + } + if($mode == 'multi') { + if(empty($fetchData['data'])) { return $this->generateOutput(true, array(), array()); } + $datasets = explode('|', $fetchData['data']); + + $output = array(); + + foreach($datasets as $datablock) { + $datablock = explode(' ', $datablock); + + $tmpArray = array(); + + foreach($datablock as $dataset) { + $dataset = explode('=', $dataset); + if(count($dataset) > 2) { + for($i = 2; $i < count($dataset); $i++) { + $dataset[1] .= '='.$dataset[$i]; + } + $tmpArray[$this->unEscapeText($dataset[0])] = $this->unEscapeText($dataset[1]); + }else{ + if(count($dataset) == 1) { + $tmpArray[$this->unEscapeText($dataset[0])] = ''; + }else{ + $tmpArray[$this->unEscapeText($dataset[0])] = $this->unEscapeText($dataset[1]); + } + } + } + $output[] = $tmpArray; + } + return $this->generateOutput(true, array(), $output); + } + if($mode == 'plain') { + return $fetchData; + } + }else{ + return $this->generateOutput(false, $fetchData['errors'], false); + } + } + + /** + * ftSendKey + * + * Sends down/upload-key to ftHost + * + * @author Stefan Zehnpfennig + * @param string $key + * @param string $additional + * @return none + */ + private function ftSendKey($key, $additional = NULL) { + @fputs($this->runtime['fileSocket'], $key.$additional); + } + + /** + * ftSendData + * + * Sends data to ftHost + * + * @author Stefan Zehnpfennig + * @param mixed $data + * @return none + */ + private function ftSendData($data) { + $data = str_split($data, 4096); + foreach($data as $dat) { + @fputs($this->runtime['fileSocket'], $dat); + } + } + + /** + * ftRead + * + * Reads data from ftHost + * + * @author Stefan Zehnpfennig + * @param int $size + * @return string data + */ + private function ftRead($size) { + $data = ''; + while(strlen($data) < $size) { + $data .= fgets($this->runtime['fileSocket'], 4096); + } + return $data; + } + +//******************************************************************************************* +//************************************* Debug Functions ************************************* +//******************************************************************************************* + + /** + * getDebugLog + * + * Returns the debug log + * + * Output: + *
+     * Array
+     * {
+     *  [0] => Error in login() on line 1908: ErrorID: 520 | Message: invalid loginname or password
+     *  [1] => Error in selectServer() on line 2044: ErrorID: 1540 | Message: convert error
+     * }
+     * 
+ * + * @author Stefan Zehnpfennig + * @return array debugLog + */ + public function getDebugLog() { + return $this->runtime['debug']; + } + + /** + * addDebugLog + * + * Adds an entry to debugLog + * + * @author Stefan Zehnpfennig + * @param string $text text which should added to debugLog + * @param string $methodName name of the executed method [optional] + * @param string $line line where error triggered [optional] + * @return array debugLog + */ + private function addDebugLog($text, $methodName = '', $line = '') { + if(empty($methodName) and empty($line)) { + $backtrace = debug_backtrace(); + $methodName = $backtrace[1]['function']; + $line = $backtrace[0]['line']; + } + $this->runtime['debug'][] = 'Error in '.$methodName.'() on line '.$line.': '.$text; + } +} + +/** \mainpage ts3admin.class + * + * \section intro_sec Welcome + * + * The ts3admin.class is a powerful api for communication with Teamspeak 3 Servers from your website! Your creativity knows no bounds! + * + * http://ts3admin.info + */ +?> diff --git a/TeaSpeak/servers/teamspeak/teamspeak.php b/TeaSpeak/servers/teamspeak/teamspeak.php new file mode 100644 index 0000000..8a586c4 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/teamspeak.php @@ -0,0 +1,1176 @@ + "TeaSpeak Provisioning Server", + "APIVersion" => "1.2", + "RequiresServer" => true, + "DefaultNonSSLPort" => "10101", + "ServiceSingleSignOnLabel" => "Login to TeaSpeak Panel", + "AdminSingleSignOnLabel" => "Login to TeaSpeak as Admin", + ]; +} + +/** + * Configuration options + */ +function teamspeak_ConfigOptions(): array +{ + return []; +} + +/** + * Create new TeaSpeak account + */ +function teamspeak_CreateAccount(array $params): string +{ + try { + $settings = Capsule::table("modwhmcs_teamspeak_settings") + ->where("id", 1) + ->first(); + + if (!$settings) { + throw new Exception( + "TeaSpeak module settings not found. Please configure the addon module first.", + ); + } + + $slots = (int) ($params["configoptions"]["Slots"] ?? 0); + $mbots = (int) ($params["configoptions"]["MBots"] ?? 0); + + // Validate TSDNS if enabled + if ($settings->enabletsdns) { + if ( + !isset($params["customfields"]["Subdomain"]) || + empty($params["customfields"]["Subdomain"]) + ) { + throw new Exception( + 'Custom field "Subdomain" is required but not set', + ); + } + + $tsdnsClient = new TSDNS($settings->urlapi, $settings->keyapi); + + if (!$tsdnsClient) { + throw new Exception( + "Could not connect to TSDNS server: " . $settings->urlapi, + ); + } + + $subdomain = + $params["customfields"]["Subdomain"] . + "." . + $settings->domaintsdns; + $request = $tsdnsClient->getZone($subdomain); + $zone = json_decode($request->body); + + if (isset($zone->message) && count($zone->message) > 0) { + throw new Exception("Subdomain already exists"); + } + } + + // Connect to TeamSpeak server + $tsAdmin = new TeamSpeak($params["serverip"], $params["serverport"]); + + if (!$tsAdmin->getElement("success", $tsAdmin->connect())) { + throw new Exception("Could not connect to the TeamSpeak server"); + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->login( + $params["serverusername"], + $params["serverpassword"], + ), + ) + ) { + throw new Exception("TeamSpeak ServerQuery login failed"); + } + + // Find available port + $port = _modwhmcs_findPort( + $params, + (int) $settings->minport, + (int) $settings->maxport, + ); + + if (!$port) { + throw new Exception( + "No free ports available in the configured range", + ); + } + + if (!$slots) { + throw new Exception( + "Slots parameter not found in configurable options", + ); + } + + if (!$mbots) { + throw new Exception( + "MBots parameter not found in configurable options", + ); + } + + // Validate custom fields exist + if ( + !Capsule::table("tblcustomfields") + ->where("fieldname", "Token") + ->where("relid", $params["pid"]) + ->value("id") + ) { + throw new Exception('Custom field "Token" does not exist'); + } + + if ( + !Capsule::table("tblcustomfields") + ->where("fieldname", "Port") + ->where("relid", $params["pid"]) + ->value("id") + ) { + throw new Exception('Custom field "Port" does not exist'); + } + + // Prepare server data + $data = [ + "virtualserver_maxclients" => $slots, + "virtualserver_name" => $settings->servername, + "virtualserver_autostart" => true, + "virtualserver_hostbanner_url" => $settings->bannerlinkurl, + "virtualserver_hostbanner_gfx_url" => $settings->bannerimgurl, + "virtualserver_hostbanner_mode" => $settings->bannermode, + "virtualserver_hostbutton_url" => $settings->buttonlinkurl, + "virtualserver_hostbutton_gfx_url" => $settings->buttonimgurl, + "virtualserver_hostbutton_tooltip" => $settings->buttontooltip, + "virtualserver_hostmessage" => $settings->servermsg, + "virtualserver_hostmessage_mode" => $settings->servermsgmode, + "virtualserver_welcomemessage" => $settings->servermsgwelcome, + "virtualserver_port" => $port, + "virtualserver_download_quota" => $settings->downloadquota, + "virtualserver_upload_quota" => $settings->uploadquota, + "virtualserver_download_total_bandwidth" => + $settings->downloadbandwidth, + "virtualserver_upload_total_bandwidth" => + $settings->uploadbandwidth, + "virtualserver_music_bot_limit" => $mbots, + ]; + + $newserver = $tsAdmin->serverCreate($data); + + if (!$tsAdmin->getElement("success", $newserver)) { + throw new Exception("Failed to create TeamSpeak server"); + } + + // Update custom fields + $tokenFieldId = Capsule::table("tblcustomfields") + ->where("fieldname", "Token") + ->where("relid", $params["pid"]) + ->value("id"); + + Capsule::table("tblcustomfieldsvalues") + ->where("fieldid", $tokenFieldId) + ->where("relid", $params["serviceid"]) + ->update(["value" => $newserver["data"]["token"]]); + + $portFieldId = Capsule::table("tblcustomfields") + ->where("fieldname", "Port") + ->where("relid", $params["pid"]) + ->value("id"); + + Capsule::table("tblcustomfieldsvalues") + ->where("fieldid", $portFieldId) + ->where("relid", $params["serviceid"]) + ->update(["value" => $newserver["data"]["virtualserver_port"]]); + + // Register TSDNS if enabled + if ($settings->enabletsdns) { + $subdomain = + $params["customfields"]["Subdomain"] . + "." . + $settings->domaintsdns; + $tsdnsClient->addZone( + $subdomain, + $params["serverip"] . ":" . $port, + ); + } + + return "success"; + } catch (Exception $e) { + logModuleCall( + "teamspeak", + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString(), + ); + + return $e->getMessage(); + } +} + +/** + * Suspend TeaSpeak account + */ +function teamspeak_SuspendAccount(array $params): string +{ + try { + $port = $params["customfields"]["Port"] ?? null; + + if (!$port) { + throw new Exception("Port does not exist in custom fields"); + } + + $tsAdmin = new TeamSpeak($params["serverip"], $params["serverport"]); + + if (!$tsAdmin->getElement("success", $tsAdmin->connect())) { + throw new Exception("Could not connect to the TeamSpeak server"); + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->login( + $params["serverusername"], + $params["serverpassword"], + ), + ) + ) { + throw new Exception("TeamSpeak ServerQuery login failed"); + } + + if (!$tsAdmin->getElement("success", $tsAdmin->selectServer($port))) { + throw new Exception("Server not found on port: " . $port); + } + + // Disable autostart + $data = ["virtualserver_autostart" => 0]; + if (!$tsAdmin->getElement("success", $tsAdmin->serverEdit($data))) { + throw new Exception( + "Failed to disable autostart for port: " . $port, + ); + } + + // Stop server + $sid = $tsAdmin->serverIdGetByPort($port); + $serverstop = $tsAdmin->serverStop($sid["data"]["server_id"]); + + if (!$tsAdmin->getElement("success", $serverstop)) { + throw new Exception( + "Could not stop server: " . + ($serverstop["errors"][0] ?? "Unknown error"), + ); + } + + return "success"; + } catch (Exception $e) { + logModuleCall( + "teamspeak", + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString(), + ); + + return $e->getMessage(); + } +} + +/** + * Unsuspend TeaSpeak account + */ +function teamspeak_UnsuspendAccount(array $params): string +{ + try { + $port = $params["customfields"]["Port"] ?? null; + + if (!$port) { + throw new Exception("Port does not exist in custom fields"); + } + + $tsAdmin = new TeamSpeak($params["serverip"], $params["serverport"]); + + if (!$tsAdmin->getElement("success", $tsAdmin->connect())) { + throw new Exception("Could not connect to the TeamSpeak server"); + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->login( + $params["serverusername"], + $params["serverpassword"], + ), + ) + ) { + throw new Exception("TeamSpeak ServerQuery login failed"); + } + + // Start server + $sid = $tsAdmin->serverIdGetByPort($port); + $serverstart = $tsAdmin->serverStart($sid["data"]["server_id"]); + + if (!$tsAdmin->getElement("success", $serverstart)) { + throw new Exception( + "Could not start server: " . + ($serverstart["errors"][0] ?? "Unknown error"), + ); + } + + if (!$tsAdmin->getElement("success", $tsAdmin->selectServer($port))) { + throw new Exception("Server not found on port: " . $port); + } + + // Enable autostart + $data = ["virtualserver_autostart" => 1]; + if (!$tsAdmin->getElement("success", $tsAdmin->serverEdit($data))) { + throw new Exception( + "Failed to enable autostart for port: " . $port, + ); + } + + return "success"; + } catch (Exception $e) { + logModuleCall( + "teamspeak", + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString(), + ); + + return $e->getMessage(); + } +} + +/** + * Terminate TeaSpeak account + */ +function teamspeak_TerminateAccount(array $params): string +{ + try { + $settings = Capsule::table("modwhmcs_teamspeak_settings") + ->select("enabletsdns", "domaintsdns", "keyapi", "urlapi") + ->first(); + + $port = $params["customfields"]["Port"] ?? null; + + if (!$port) { + throw new Exception("Port does not exist in custom fields"); + } + + $tsAdmin = new TeamSpeak($params["serverip"], $params["serverport"]); + + if (!$tsAdmin->getElement("success", $tsAdmin->connect())) { + throw new Exception("Could not connect to the TeamSpeak server"); + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->login( + $params["serverusername"], + $params["serverpassword"], + ), + ) + ) { + throw new Exception("TeamSpeak ServerQuery login failed"); + } + + $sid = $tsAdmin->serverIdGetByPort($port); + + if ( + $tsAdmin->getElement( + "success", + $tsAdmin->serverDelete($sid["data"]["server_id"]), + ) + ) { + // Delete backups + Capsule::table("modwhmcs_teamspeak_backups") + ->where("port", $port) + ->delete(); + + // Remove TSDNS entry if enabled + if ($settings && $settings->enabletsdns) { + $tsdnsClient = new TSDNS($settings->urlapi, $settings->keyapi); + $subdomain = + $params["customfields"]["Subdomain"] . + "." . + $settings->domaintsdns; + $tsdnsClient->deleteZone($subdomain); + } + } else { + throw new Exception("Could not delete TeamSpeak server"); + } + + return "success"; + } catch (Exception $e) { + logModuleCall( + "teamspeak", + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString(), + ); + + return $e->getMessage(); + } +} + +/** + * Change package/upgrade + */ +function teamspeak_ChangePackage(array $params): string +{ + try { + $slots = (int) ($params["configoptions"]["Slots"] ?? 0); + $mbots = (int) ($params["configoptions"]["MBots"] ?? 0); + $port = $params["customfields"]["Port"] ?? null; + + if (!$port) { + throw new Exception("Port does not exist in custom fields"); + } + + if (!$slots) { + throw new Exception("Slots parameter not found"); + } + + if (!$mbots) { + throw new Exception("MBots parameter not found"); + } + + $tsAdmin = new TeamSpeak($params["serverip"], $params["serverport"]); + + if (!$tsAdmin->getElement("success", $tsAdmin->connect())) { + throw new Exception("Could not connect to the TeamSpeak server"); + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->login( + $params["serverusername"], + $params["serverpassword"], + ), + ) + ) { + throw new Exception("TeamSpeak ServerQuery login failed"); + } + + if (!$tsAdmin->getElement("success", $tsAdmin->selectServer($port))) { + throw new Exception("Server not found on port: " . $port); + } + + $data = [ + "virtualserver_maxclients" => $slots, + "virtualserver_music_bot_limit" => $mbots, + ]; + + if (!$tsAdmin->getElement("success", $tsAdmin->serverEdit($data))) { + throw new Exception( + "Failed to update server settings for port: " . $port, + ); + } + + return "success"; + } catch (Exception $e) { + logModuleCall( + "teamspeak", + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString(), + ); + + return $e->getMessage(); + } +} + +/** + * Test connection to server + */ +function teamspeak_TestConnection(array $params): array +{ + try { + $tsAdmin = new TeamSpeak($params["serverip"], $params["serverport"]); + + if (!$tsAdmin->getElement("success", $tsAdmin->connect())) { + throw new Exception("Could not connect to the TeamSpeak server"); + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->login( + $params["serverusername"], + $params["serverpassword"], + ), + ) + ) { + throw new Exception("TeamSpeak ServerQuery login failed"); + } + + return [ + "success" => true, + "error" => "", + ]; + } catch (Exception $e) { + logModuleCall( + "teamspeak", + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString(), + ); + + return [ + "success" => false, + "error" => $e->getMessage(), + ]; + } +} + +/** + * Admin custom buttons + */ +function teamspeak_AdminCustomButtonArray(): array +{ + return [ + "Start" => "start_server", + "Stop" => "stop_server", + "Reinstall" => "reinstall_server", + "Restore Permissions" => "perm_reset", + ]; +} + +/** + * Client area custom buttons + */ +function teamspeak_ClientAreaCustomButtonArray(): array +{ + return [ + "Start Server" => "start_server", + "Stop Server" => "stop_server", + "Reinstall Server" => "reinstall_server", + "Restore Permissions" => "perm_reset", + "Edit Subdomain" => "tsdns", + "Settings" => "settings", + "Backups" => "backups", + "Privileges" => "tokens", + "Prohibitions" => "bans", + ]; +} + +/** + * Start server action + */ +function teamspeak_start_server(array $params): string +{ + try { + $port = $params["customfields"]["Port"] ?? null; + + if (!$port) { + throw new Exception("Port does not exist in custom fields"); + } + + $tsAdmin = new TeamSpeak($params["serverip"], $params["serverport"]); + + if (!$tsAdmin->getElement("success", $tsAdmin->connect())) { + throw new Exception("Server unavailable. Please contact support."); + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->login( + $params["serverusername"], + $params["serverpassword"], + ), + ) + ) { + throw new Exception( + "Unable to connect to server. Please contact support.", + ); + } + + // Check if server is already online + $serverlist = $tsAdmin->serverList(); + foreach ($serverlist["data"] as $server) { + if ( + $server["virtualserver_port"] == $port && + $server["virtualserver_status"] == "Online" + ) { + throw new Exception("Server is already online"); + } + } + + $getsid = $tsAdmin->serverIdGetByPort($port); + if (!$tsAdmin->getElement("success", $getsid)) { + throw new Exception( + "Server could not be started. Please contact support. (Error: Server ID not found)", + ); + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->serverStart($getsid["data"]["server_id"]), + ) + ) { + throw new Exception( + "Server could not be started. Please contact support. (Error: Start command failed)", + ); + } + + return "success"; + } catch (Exception $e) { + logModuleCall( + "teamspeak", + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString(), + ); + + return $e->getMessage(); + } +} + +/** + * Stop server action + */ +function teamspeak_stop_server(array $params): string +{ + try { + $port = $params["customfields"]["Port"] ?? null; + + if (!$port) { + throw new Exception("Port does not exist in custom fields"); + } + + $tsAdmin = new TeamSpeak($params["serverip"], $params["serverport"]); + + if (!$tsAdmin->getElement("success", $tsAdmin->connect())) { + throw new Exception("Server unavailable. Please contact support."); + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->login( + $params["serverusername"], + $params["serverpassword"], + ), + ) + ) { + throw new Exception( + "Unable to connect to server. Please contact support.", + ); + } + + // Check if server is already offline + $serverlist = $tsAdmin->serverList(); + foreach ($serverlist["data"] as $server) { + if ( + $server["virtualserver_port"] == $port && + $server["virtualserver_status"] == "offline" + ) { + throw new Exception("Server is already stopped"); + } + } + + $getsid = $tsAdmin->serverIdGetByPort($port); + if (!$tsAdmin->getElement("success", $getsid)) { + throw new Exception( + "Server not found. (Error: Server ID not found)", + ); + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->serverStop($getsid["data"]["server_id"]), + ) + ) { + throw new Exception( + "Server could not be stopped. Please contact support. (Error: Stop command failed)", + ); + } + + return "success"; + } catch (Exception $e) { + logModuleCall( + "teamspeak", + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString(), + ); + + return $e->getMessage(); + } +} + +/** + * Reinstall server action + */ +function teamspeak_reinstall_server(array $params): string +{ + try { + $port = $params["customfields"]["Port"] ?? null; + $slots = (int) ($params["configoptions"]["Slots"] ?? 0); + $mbots = (int) ($params["configoptions"]["MBots"] ?? 0); + + if (!$port) { + throw new Exception("Port does not exist in custom fields"); + } + + if (!$slots) { + throw new Exception( + "Problem during reinstallation. (Error: Slots parameter not found)", + ); + } + + if (!$mbots) { + throw new Exception( + "Problem during reinstallation. (Error: MBots parameter not found)", + ); + } + + $tsAdmin = new TeamSpeak($params["serverip"], $params["serverport"]); + + if (!$tsAdmin->getElement("success", $tsAdmin->connect())) { + throw new Exception("Server unavailable. Please contact support."); + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->login( + $params["serverusername"], + $params["serverpassword"], + ), + ) + ) { + throw new Exception( + "Unable to connect to server. Please contact support.", + ); + } + + // Delete old server + $getsid = $tsAdmin->serverIdGetByPort($port); + if ( + !$tsAdmin->getElement("success", $getsid) || + !$tsAdmin->getElement( + "success", + $tsAdmin->serverDelete($getsid["data"]["server_id"]), + ) + ) { + throw new Exception( + "Problem during reinstallation. Please contact support. (Error: Delete failed)", + ); + } + + // Validate custom fields + if (!isset($params["customfields"]["Token"])) { + throw new Exception( + "Problem during reinstallation. (Error: Token field not found)", + ); + } + + if (!isset($params["customfields"]["Port"])) { + throw new Exception( + "Problem during reinstallation. (Error: Port field not found)", + ); + } + + // Get settings + $settings = Capsule::table("modwhmcs_teamspeak_settings") + ->where("id", 1) + ->first(); + + if (!$settings) { + throw new Exception("Module settings not found"); + } + + // Prepare new server data + $data = [ + "virtualserver_maxclients" => $slots, + "virtualserver_name" => $settings->servername, + "virtualserver_autostart" => true, + "virtualserver_hostbanner_url" => $settings->bannerlinkurl, + "virtualserver_hostbanner_gfx_url" => $settings->bannerimgurl, + "virtualserver_hostbanner_mode" => $settings->bannermode, + "virtualserver_hostbutton_url" => $settings->buttonlinkurl, + "virtualserver_hostbutton_gfx_url" => $settings->buttonimgurl, + "virtualserver_hostbutton_tooltip" => $settings->buttontooltip, + "virtualserver_hostmessage" => $settings->servermsg, + "virtualserver_hostmessage_mode" => $settings->servermsgmode, + "virtualserver_welcomemessage" => $settings->servermsgwelcome, + "virtualserver_port" => $port, + "virtualserver_download_quota" => $settings->downloadquota, + "virtualserver_upload_quota" => $settings->uploadquota, + "virtualserver_download_total_bandwidth" => + $settings->downloadbandwidth, + "virtualserver_upload_total_bandwidth" => + $settings->uploadbandwidth, + "virtualserver_music_bot_limit" => $mbots, + ]; + + $newserver = $tsAdmin->serverCreate($data); + if (!$tsAdmin->getElement("success", $newserver)) { + throw new Exception( + "Problem during reinstallation. Please contact support. (Error: Create failed)", + ); + } + + // Update token custom field + $tokenFieldId = Capsule::table("tblcustomfields") + ->where("fieldname", "Token") + ->where("relid", $params["pid"]) + ->value("id"); + + Capsule::table("tblcustomfieldsvalues") + ->where("fieldid", $tokenFieldId) + ->where("relid", $params["serviceid"]) + ->update(["value" => $newserver["data"]["token"]]); + + return "success"; + } catch (Exception $e) { + logModuleCall( + "teamspeak", + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString(), + ); + + return $e->getMessage(); + } +} + +/** + * Reset permissions action + */ +function teamspeak_perm_reset(array $params): string +{ + try { + $port = $params["customfields"]["Port"] ?? null; + + if (!$port) { + throw new Exception("Port does not exist in custom fields"); + } + + $tsAdmin = new TeamSpeak($params["serverip"], $params["serverport"]); + + if (!$tsAdmin->getElement("success", $tsAdmin->connect())) { + throw new Exception("Server unavailable. Please contact support."); + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->login( + $params["serverusername"], + $params["serverpassword"], + ), + ) + ) { + throw new Exception( + "Unable to connect to server. Please contact support.", + ); + } + + if (!$tsAdmin->getElement("success", $tsAdmin->selectServer($port))) { + throw new Exception( + "Server offline or unavailable. Please contact support. (Error: Select)", + ); + } + + $response = $tsAdmin->permReset(); + if (!$tsAdmin->getElement("success", $response)) { + throw new Exception( + "Could not restore permissions to default. Please contact support. (Error: Restore)", + ); + } + + // Update token + $tokenFieldId = Capsule::table("tblcustomfields") + ->where("fieldname", "Token") + ->where("relid", $params["pid"]) + ->value("id"); + + Capsule::table("tblcustomfieldsvalues") + ->where("fieldid", $tokenFieldId) + ->where("relid", $params["serviceid"]) + ->update(["value" => $response["data"]["token"]]); + + return "success"; + } catch (Exception $e) { + logModuleCall( + "teamspeak", + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString(), + ); + + return $e->getMessage(); + } +} + +/** + * Client area output + */ +function teamspeak_ClientArea(array $params): array +{ + try { + // Load language file + $clientLang = $params["clientsdetails"]["language"] ?? "english"; + $langFilePath = __DIR__ . "/lang.json"; + + if (!file_exists($langFilePath)) { + throw new Exception("Language file not found"); + } + + $langData = json_decode(file_get_contents($langFilePath), true); + $lang = $langData[$clientLang] ?? $langData["english"]; + + $settings = Capsule::table("modwhmcs_teamspeak_settings") + ->select("enabletsdns", "domaintsdns", "urlapi", "keyapi") + ->first(); + + $tsAdmin = new TeamSpeak($params["serverip"], $params["serverport"]); + $hostteamspeak = ["status" => false]; + + // Check connection + if ( + $tsAdmin->getElement("success", $tsAdmin->connect()) && + $tsAdmin->getElement( + "success", + $tsAdmin->login( + $params["serverusername"], + $params["serverpassword"], + ), + ) + ) { + $hostteamspeak["status"] = true; + } + + // Check virtual server status + $hostteamspeak["vs"]["status"] = false; + $port = $params["customfields"]["Port"] ?? null; + + if ( + $port && + $tsAdmin->getElement("success", $tsAdmin->selectServer($port)) && + $tsAdmin->getElement("success", $tsAdmin->serverIdGetByPort($port)) + ) { + $serverinfo = $tsAdmin->serverInfo(); + if ( + isset($serverinfo["data"]["virtualserver_status"]) && + $serverinfo["data"]["virtualserver_status"] === "online" + ) { + $hostteamspeak["vs"]["status"] = true; + } + } + + // Get logs + $logs = []; + if ($hostteamspeak["status"] && $hostteamspeak["vs"]["status"]) { + $logResponse = $tsAdmin->logView(5); + if (isset($logResponse["data"])) { + foreach ($logResponse["data"] as $key => $log) { + $logParts = explode("|", $log["l"]); + if (isset($logParts[0])) { + $dateParts = explode(".", $logParts[0]); + $logParts[0] = $dateParts[0] ?? $logParts[0]; + } + unset($logParts[2], $logParts[3]); + $logs[] = $logParts; + } + } + } + + return [ + "tabOverviewReplacementTemplate" => "templates/overview.tpl", + "templateVariables" => [ + "settings" => $settings ? get_object_vars($settings) : [], + "customfields" => $params["customfields"], + "logs" => $logs, + "hostteamspeak" => $hostteamspeak, + "lang" => $lang, + ], + ]; + } catch (Exception $e) { + logModuleCall( + "teamspeak", + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString(), + ); + + return [ + "tabOverviewReplacementTemplate" => "templates/error.tpl", + "templateVariables" => [ + "usefulErrorHelper" => $e->getMessage(), + ], + ]; + } +} + +/** + * TSDNS management + */ +function teamspeak_tsdns(array $params) +{ + try { + $settings = Capsule::table("modwhmcs_teamspeak_settings") + ->select("enabletsdns", "domaintsdns", "urlapi", "keyapi") + ->first(); + + $vars = [ + "settings" => $settings ? get_object_vars($settings) : [], + "customfields" => $params["customfields"], + ]; + + // Handle zone edit + if (isset($_GET["ma"]) && $_GET["ma"] === "editzone") { + $newZone = $_GET["zone"] ?? ""; + $oldZone = $_GET["oldzone"] ?? ""; + + if (empty($newZone)) { + throw new Exception("No zone was specified"); + } + + if ($newZone === $oldZone) { + throw new Exception("The new zone is the same as the old zone"); + } + + $tsdnsClient = new TSDNS($settings->urlapi, $settings->keyapi); + + // Check if new zone exists + $response = $tsdnsClient->getZone( + $newZone . "." . $settings->domaintsdns, + ); + $result = json_decode($response->body); + + if (isset($result->message) && count($result->message) > 0) { + throw new Exception("The specified zone already exists"); + } + + // Delete old zone and add new one + $tsdnsClient->deleteZone($oldZone . "." . $settings->domaintsdns); + $response = $tsdnsClient->addZone( + $newZone . "." . $settings->domaintsdns, + $params["serverip"] . ":" . $params["customfields"]["Port"], + ); + + $result = json_decode($response->body); + + if (isset($result->message) && count($result->message) > 0) { + throw new Exception("The zone could not be updated"); + } + + // Update custom field + Capsule::table("tblcustomfieldsvalues") + ->where("value", $params["customfields"]["Subdomain"]) + ->update(["value" => $newZone]); + + return "success"; + } + + return [ + "templatefile" => "templates/tsdns", + "vars" => $vars, + ]; + } catch (Exception $e) { + logModuleCall( + "teamspeak", + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString(), + ); + + return $e->getMessage(); + } +} + +// Include additional functions +require_once __DIR__ . "/teamspeak_additional.php"; + +/** + * Helper function to find available port + */ +function _modwhmcs_findPort(array $params, int $startPort, int $endPort): int +{ + $tsAdmin = new TeamSpeak($params["serverip"], $params["serverport"]); + + if (!$tsAdmin->getElement("success", $tsAdmin->connect())) { + return 0; + } + + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->login( + $params["serverusername"], + $params["serverpassword"], + ), + ) + ) { + return 0; + } + + $currentPort = $startPort; + while ($currentPort <= $endPort) { + if ( + !$tsAdmin->getElement( + "success", + $tsAdmin->serverIdGetByPort($currentPort), + ) + ) { + return $currentPort; + } + $currentPort++; + } + + return 0; +} diff --git a/TeaSpeak/servers/teamspeak/teamspeak_additional.php b/TeaSpeak/servers/teamspeak/teamspeak_additional.php new file mode 100644 index 0000000..f1033a0 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/teamspeak_additional.php @@ -0,0 +1,555 @@ +where('port', $port) + ->get(); + + $vars = [ + 'backups' => array_map(fn($backup) => get_object_vars($backup), iterator_to_array($backups)), + ]; + + // Handle backup actions + if (!empty($_GET['custom'])) { + $action = $_GET['custom']; + $backupId = (int)($_GET['backupid'] ?? 0); + + switch ($action) { + case 'create': + $tsAdmin = new TeamSpeak($params['serverip'], $params['serverport']); + + if (!$tsAdmin->getElement('success', $tsAdmin->connect())) { + throw new Exception('Server unavailable. Please contact support.'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->login($params['serverusername'], $params['serverpassword']))) { + throw new Exception('Unable to connect to server. Please contact support.'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->selectServer($port))) { + throw new Exception('Server is offline or does not exist'); + } + + $getsid = $tsAdmin->serverIdGetByPort($port); + $snapshot = $tsAdmin->serverSnapshotCreate(); + + if (!$tsAdmin->getElement('success', $snapshot)) { + throw new Exception('Failed to create backup snapshot'); + } + + $snapshotData = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", ltrim($snapshot['data'])); + + Capsule::table('modwhmcs_teamspeak_backups')->insert([ + 'sid' => $getsid['data']['server_id'], + 'port' => $port, + 'data' => $snapshotData, + 'date' => date("Y-m-d H:i:s"), + ]); + break; + + case 'download': + if (!$backupId) { + throw new Exception('Backup ID not specified'); + } + + $data = Capsule::table('modwhmcs_teamspeak_backups') + ->where('id', $backupId) + ->value('data'); + + if (!$data) { + throw new Exception('Backup not found'); + } + + header('Content-Type: text/plain; charset=utf-8'); + header('Content-Disposition: attachment; filename="backup_' . date("Y-m-d_His") . '.txt"'); + echo $data; + exit; + + case 'restore': + if (!$backupId) { + throw new Exception('Backup ID not specified'); + } + + $backup = Capsule::table('modwhmcs_teamspeak_backups') + ->where('id', $backupId) + ->value('data'); + + if (!$backup) { + throw new Exception('Backup not found'); + } + + $tsAdmin = new TeamSpeak($params['serverip'], $params['serverport']); + + if (!$tsAdmin->getElement('success', $tsAdmin->connect())) { + throw new Exception('Server unavailable. Please contact support.'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->login($params['serverusername'], $params['serverpassword']))) { + throw new Exception('Unable to connect to server. Please contact support.'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->selectServer($port))) { + throw new Exception('Server is offline or does not exist'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->serverSnapshotDeploy($backup))) { + throw new Exception('Backup could not be restored'); + } + break; + + case 'delete': + if (!$backupId) { + throw new Exception('Backup ID not specified'); + } + + Capsule::table('modwhmcs_teamspeak_backups') + ->where('id', $backupId) + ->delete(); + break; + + default: + throw new Exception('Invalid action'); + } + + return 'success'; + } + + return [ + 'templatefile' => 'templates/backups', + 'vars' => $vars, + ]; + + } catch (Exception $e) { + logModuleCall( + 'teamspeak', + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString() + ); + + return $e->getMessage(); + } +} + +/** + * Token/Privileges management + */ +function teamspeak_tokens(array $params) +{ + try { + $port = $params['customfields']['Port'] ?? null; + + if (!$port) { + throw new Exception('Port does not exist in custom fields'); + } + + $tsAdmin = new TeamSpeak($params['serverip'], $params['serverport']); + + if (!$tsAdmin->getElement('success', $tsAdmin->connect())) { + throw new Exception('Server unavailable. Please contact support.'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->login($params['serverusername'], $params['serverpassword']))) { + throw new Exception('Unable to connect to server. Please contact support.'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->selectServer($port))) { + throw new Exception('Server is offline or does not exist'); + } + + // Get token list + $response = $tsAdmin->tokenList(); + $tokens = $response['data'] ?? []; + + // Get server group list + $serverglist = $tsAdmin->serverGroupList(); + $sglist = []; + + if (isset($serverglist['data'])) { + foreach ($serverglist['data'] as $sg) { + if (($sg['type'] ?? 0) == 1) { + $sglist[] = $sg; + } + } + } + + $vars = [ + 'tokens' => $tokens, + 'sglist' => $sglist, + ]; + + // Handle token actions + if (!empty($_GET['custom'])) { + $action = $_GET['custom']; + + switch ($action) { + case 'create': + $groupId = (int)($_GET['groupid'] ?? 0); + $description = $_GET['desc'] ?? ''; + + if (!$groupId) { + throw new Exception('Group ID not specified'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->tokenAdd(0, $groupId, 0, $description))) { + throw new Exception('Unable to create token. Please contact support.'); + } + break; + + case 'delete': + $token = $_GET['token'] ?? ''; + + if (!$token) { + throw new Exception('Token not specified'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->tokenDelete($token))) { + throw new Exception('Unable to delete token. Please contact support.'); + } + break; + + default: + throw new Exception('Invalid action'); + } + + return 'success'; + } + + return [ + 'templatefile' => 'templates/tokens', + 'vars' => $vars, + ]; + + } catch (Exception $e) { + logModuleCall( + 'teamspeak', + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString() + ); + + return $e->getMessage(); + } +} + +/** + * Ban management + */ +function teamspeak_bans(array $params) +{ + try { + $port = $params['customfields']['Port'] ?? null; + + if (!$port) { + throw new Exception('Port does not exist in custom fields'); + } + + $tsAdmin = new TeamSpeak($params['serverip'], $params['serverport']); + + if (!$tsAdmin->getElement('success', $tsAdmin->connect())) { + throw new Exception('Server unavailable. Please contact support.'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->login($params['serverusername'], $params['serverpassword']))) { + throw new Exception('Unable to connect to server. Please contact support.'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->selectServer($port))) { + throw new Exception('Server is offline or does not exist'); + } + + // Get ban list + $response = $tsAdmin->banList(); + $bans = $response['data'] ?? []; + + $vars = [ + 'bans' => $bans, + ]; + + // Handle ban actions + if (!empty($_GET['custom'])) { + $action = $_GET['custom']; + + switch ($action) { + case 'create': + $banType = $_GET['bantype'] ?? ''; + $input = $_GET['inu'] ?? ''; + $reason = $_GET['reason'] ?? ''; + + if (!$banType || !$input) { + throw new Exception('Ban type and input are required'); + } + + switch ($banType) { + case 'ip': + if (filter_var($input, FILTER_VALIDATE_IP) === false) { + throw new Exception('Invalid IP address'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->banAddByIp($input, 0, $reason))) { + throw new Exception('Unable to create IP ban. Please contact support.'); + } + break; + + case 'name': + if (!$tsAdmin->getElement('success', $tsAdmin->banAddByName($input, 0, $reason))) { + throw new Exception('Unable to create name ban. Please contact support.'); + } + break; + + case 'uid': + if (!$tsAdmin->getElement('success', $tsAdmin->banAddByUid($input, 0, $reason))) { + throw new Exception('Unable to create UID ban. Please contact support.'); + } + break; + + default: + throw new Exception('Invalid ban type'); + } + break; + + case 'delete': + $banId = (int)($_GET['banid'] ?? 0); + + if (!$banId) { + throw new Exception('Ban ID not specified'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->banDelete($banId))) { + throw new Exception('Unable to delete ban. Please contact support.'); + } + break; + + default: + throw new Exception('Invalid action'); + } + + return 'success'; + } + + return [ + 'templatefile' => 'templates/bans', + 'vars' => $vars, + ]; + + } catch (Exception $e) { + logModuleCall( + 'teamspeak', + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString() + ); + + return $e->getMessage(); + } +} + +/** + * Server settings management + */ +function teamspeak_settings(array $params) +{ + try { + $port = $params['customfields']['Port'] ?? null; + + if (!$port) { + throw new Exception('Port does not exist in custom fields'); + } + + $tsAdmin = new TeamSpeak($params['serverip'], $params['serverport']); + + if (!$tsAdmin->getElement('success', $tsAdmin->connect())) { + throw new Exception('Could not connect to the TeamSpeak server'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->login($params['serverusername'], $params['serverpassword']))) { + throw new Exception('TeamSpeak ServerQuery login failed'); + } + + if (!$tsAdmin->getElement('success', $tsAdmin->selectServer($port))) { + throw new Exception('Server not found on port: ' . $port); + } + + $serverinfo = $tsAdmin->serverInfo(); + if (!$tsAdmin->getElement('success', $serverinfo)) { + throw new Exception('Could not retrieve server information'); + } + + $vars = [ + 'serverinfo' => $serverinfo['data'] ?? [], + ]; + + // Handle settings save + if (isset($_GET['custom']) && $_GET['custom'] === 'save') { + $password = $_GET['pw'] ?? ''; + $confirmPassword = $_GET['confirmpw'] ?? ''; + $hostname = $_GET['hostname'] ?? ''; + $welcomeMessage = $_GET['welcomemessage'] ?? ''; + + if ($password !== $confirmPassword) { + throw new Exception('The passwords entered do not match'); + } + + $data = [ + 'virtualserver_name' => $hostname, + 'virtualserver_welcomemessage' => $welcomeMessage, + ]; + + // Only update password if provided + if (!empty($password)) { + $data['virtualserver_password'] = $password; + } + + if (!$tsAdmin->getElement('success', $tsAdmin->serverEdit($data))) { + throw new Exception('Failed to update server settings. Please contact support.'); + } + + return 'success'; + } + + return [ + 'templatefile' => 'templates/settings', + 'vars' => $vars, + ]; + + } catch (Exception $e) { + logModuleCall( + 'teamspeak', + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString() + ); + + return $e->getMessage(); + } +} + +/** + * TSDNS zone management continuation + */ +function teamspeak_tsdns(array $params) +{ + try { + $settings = Capsule::table('modwhmcs_teamspeak_settings') + ->select('enabletsdns', 'domaintsdns', 'urlapi', 'keyapi') + ->first(); + + $vars = [ + 'settings' => $settings ? get_object_vars($settings) : [], + 'customfields' => $params['customfields'], + ]; + + // Handle zone edit + if (isset($_GET['ma']) && $_GET['ma'] === 'editzone') { + $newZone = $_GET['zone'] ?? ''; + $oldZone = $_GET['oldzone'] ?? ''; + + if (empty($newZone)) { + throw new Exception('No zone was specified'); + } + + if ($newZone === $oldZone) { + throw new Exception('The new zone is the same as the old zone'); + } + + if (!$settings) { + throw new Exception('TSDNS settings not found'); + } + + $tsdnsClient = new TSDNS($settings->urlapi, $settings->keyapi); + + // Check if new zone exists + $response = $tsdnsClient->getZone($newZone . '.' . $settings->domaintsdns); + $result = json_decode($response->body); + + if (isset($result->message) && count($result->message) > 0) { + throw new Exception('The specified zone already exists'); + } + + // Delete old zone and add new one + $tsdnsClient->deleteZone($oldZone . '.' . $settings->domaintsdns); + $response = $tsdnsClient->addZone( + $newZone . '.' . $settings->domaintsdns, + $params['serverip'] . ':' . $params['customfields']['Port'] + ); + + $result = json_decode($response->body); + + if (isset($result->message) && count($result->message) > 0) { + throw new Exception('The zone could not be updated'); + } + + // Update custom field + Capsule::table('tblcustomfieldsvalues') + ->where('value', $params['customfields']['Subdomain']) + ->update(['value' => $newZone]); + + return 'success'; + } + + return [ + 'templatefile' => 'templates/tsdns', + 'vars' => $vars, + ]; + + } catch (Exception $e) { + logModuleCall( + 'teamspeak', + __FUNCTION__, + $params, + $e->getMessage(), + $e->getTraceAsString() + ); + + return $e->getMessage(); + } +} + +/** + * Helper function to find available port + */ +function _modwhmcs_findPort(array $params, int $startPort, int $endPort): int +{ + $tsAdmin = new TeamSpeak($params['serverip'], $params['serverport']); + + if (!$tsAdmin->getElement('success', $tsAdmin->connect())) { + return 0; + } + + if (!$tsAdmin->getElement('success', $tsAdmin->login($params['serverusername'], $params['serverpassword']))) { + return 0; + } + + $currentPort = $startPort; + while ($currentPort <= $endPort) { + if (!$tsAdmin->getElement('success', $tsAdmin->serverIdGetByPort($currentPort))) { + return $currentPort; + } + $currentPort++; + } + + return 0; +} diff --git a/TeaSpeak/servers/teamspeak/templates/backups.tpl b/TeaSpeak/servers/teamspeak/templates/backups.tpl new file mode 100644 index 0000000..26ea89b --- /dev/null +++ b/TeaSpeak/servers/teamspeak/templates/backups.tpl @@ -0,0 +1,56 @@ +  Back +
+
+
+
Backups
+
+
+ + + + + + + + + + + + + + + {if !empty($backups)} + {assign var=var value=1} + {foreach $backups as $backup} + + + + + + {capture assign=var}{$var+1}{/capture} + {/foreach} + {else} + + + + {/if} + +
#Date/Time
{$var}{$backup.date|date_format:"%d/%m/%Y %H:%M:%S"}
There is no backup
+
+
+ + + + +
+ +
+
+
\ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/templates/bans.tpl b/TeaSpeak/servers/teamspeak/templates/bans.tpl new file mode 100644 index 0000000..f6f7b3b --- /dev/null +++ b/TeaSpeak/servers/teamspeak/templates/bans.tpl @@ -0,0 +1,92 @@ +  Back +
+
+
+
Bans
+
+
+ + + + + +
+ + + + + + + + + + + + + + {if !empty($bans)} + {assign var=var value=1} + {foreach $bans as $ban} + + + + + + {assign var="sumban" value="`$ban.created+$ban.duration`"} + + + + + {capture assign=var}{$var+1}{/capture} + {/foreach} + {else} + + + + {/if} + +
#IP/Name/UIDDate/TimeReasonDurationBanned byOptions
{$var}{if $ban.ip}{$ban.ip|replace:"\\":""}{elseif $ban.name} {$ban.name}{elseif $ban.uid} {$ban.uid}{/if}{$ban.created|date_format:"%d-%m-%Y %H:%M:%S"}{$ban.reason}{if $ban.duration eq 0}Indeterminada{else}{$sumban|date_format:"%d-%m-%Y %H:%M:%S"}{/if}{$ban.invokername} + +
There is no Ban
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+
\ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/templates/error.tpl b/TeaSpeak/servers/teamspeak/templates/error.tpl new file mode 100644 index 0000000..bbe3750 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/templates/error.tpl @@ -0,0 +1,4 @@ +
+
$lang.warn}
+

{$usefulErrorHelper}

+
diff --git a/TeaSpeak/servers/teamspeak/templates/overview.tpl b/TeaSpeak/servers/teamspeak/templates/overview.tpl new file mode 100644 index 0000000..13535fc --- /dev/null +++ b/TeaSpeak/servers/teamspeak/templates/overview.tpl @@ -0,0 +1,277 @@ + + +
+ +
+
+
+

{$lang.service}

+
+
+
+ {$groupname} +

{$product}

+ {$serverdata.ipaddress}:{$customfields.Port} + +
+
+
+
+
+
+

{$lang.dconnect}

+
+
+ {if $settings.enabletsdns eq 1} + {$customfields.Subdomain}.{$settings.domaintsdns} +

+ {$lang.lconnect}

+ {else} +

+ {$lang.lconnect}

+ {$lang.wconnect}

+ {/if} + +
+
+
+
+
+
+
+
+

{$lang.webpanel}

+
+
+
+
+ {$lang.hostname} +
+
+ {$serverdata.name} +
+
+ {$lang.management} +
+ +
+
+
+
+ +
+ {if $hostteamspeak.status eq true} +
+
+

{$LANG.cPanel.quickShortcuts} + {if $hostteamspeak.vs.status eq true} + {$lang.online} + {else} + {$lang.offline} + {/if} +

+
+
+ + {if $hostteamspeak.vs.status eq false} + + {$lang.start} + + {else} + + {$lang.stop} + + {/if} + + {$lang.reinstall} + + + {$lang.reset_permissions} + + +
+
+ {elseif $hostteamspeak.status eq false} +
Server is {$lang.offline}
+ {else} + + {/if} +
+ +
+ +
+
+ {if $configurableoptions} +
+
+

{$LANG.orderconfigpackage}

+
+
+ {foreach from=$configurableoptions item=configoption} +
+
+ {$configoption.optionname} +
+
+ {if $configoption.optiontype eq 3}{if $configoption.selectedqty}{$LANG.yes}{else}{$LANG.no}{/if}{elseif $configoption.optiontype eq 4}{$configoption.selectedqty} x {$configoption.selectedoption}{else}{$configoption.selectedoption}{/if} +
+
+ {/foreach} +
+
+ {/if} +
+
+ {if $customfields} +
+
+

{$LANG.additionalInfo}

+
+
+ {foreach from=$customfields key=key item=field} + {if $key neq "Subdomain"} +
+
+ {$key} +
+
+ {if empty($field)} + {$LANG.blankCustomField} + {else} + {$field} + {/if} +
+
+ {/if} + {/foreach} +
+
+ {/if} +
+
+ +
+
+

{$LANG.cPanel.billingOverview}

+
+
+ +
+
+ {if $firstpaymentamount neq $recurringamount} +
+
+ {$LANG.firstpaymentamount} +
+
+ {$firstpaymentamount} +
+
+ {/if} + {if $billingcycle != $LANG.orderpaymenttermonetime && $billingcycle != $LANG.orderfree} +
+
+ {$LANG.recurringamount} +
+
+ {$recurringamount} +
+
+ {/if} +
+
+ {$LANG.orderbillingcycle} +
+
+ {$billingcycle} +
+
+
+
+ {$LANG.orderpaymentmethod} +
+
+ {$paymentmethod} +
+
+
+
+
+
+ {$LANG.clientareahostingregdate} +
+
+ {$regdate} +
+
+
+
+ {$LANG.clientareahostingnextduedate} +
+
+ {$nextduedate} +
+
+
+
+
+
\ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/templates/overview_modern.tpl b/TeaSpeak/servers/teamspeak/templates/overview_modern.tpl new file mode 100644 index 0000000..20b6cfc --- /dev/null +++ b/TeaSpeak/servers/teamspeak/templates/overview_modern.tpl @@ -0,0 +1,351 @@ + + + + +
+ +
+ +
+
+
+
+ {$lang.service|default:"Service"} +
+
+
+ +

{$groupname}

+
{$product}
+
+ + {$serverdata.ipaddress}:{$customfields.Port} +
+
+
+
+ + +
+
+
+
+ {$lang.dconnect|default:"Connect"} +
+
+
+ {if $settings.enabletsdns eq 1} +
+
Connection Address:
+
+ {$customfields.Subdomain}.{$settings.domaintsdns} +
+
+ + {else} +
+
Connection Address:
+
+ {$serverdata.ipaddress}:{$customfields.Port} +
+
+ + {/if} +
+
+
+
+ + +
+ +
+
+
+
+ {$lang.webpanel|default:"Web Panel"} +
+
+
+
+
+ {$lang.hostname|default:"Hostname"}: +
+
+ {$serverdata.name} +
+
+
+
+ {$lang.management|default:"Management"}: +
+ +
+
+
+
+ + +
+ {if $hostteamspeak.status eq true} +
+
+
+ {$LANG.cPanel.quickShortcuts|default:"Quick Actions"} + + {if $hostteamspeak.vs.status eq true} + {$lang.online|default:"Online"} + {else} + {$lang.offline|default:"Offline"} + {/if} + +
+
+ +
+ {elseif $hostteamspeak.status eq false} +
+
+ +
+
+ {else} +
+
+ +
+
+ {/if} +
+
+ + +
+ + {if $configurableoptions} +
+
+
+
+ {$LANG.orderconfigpackage|default:"Package Configuration"} +
+
+
+ {foreach from=$configurableoptions item=configoption} +
+
+ {$configoption.optionname}: +
+
+ {if $configoption.optiontype eq 3} + + {if $configoption.selectedqty}{$LANG.yes|default:"Yes"}{else}{$LANG.no|default:"No"}{/if} + + {elseif $configoption.optiontype eq 4} + {$configoption.selectedqty} x {$configoption.selectedoption} + {else} + {$configoption.selectedoption} + {/if} +
+
+ {/foreach} +
+
+
+ {/if} + + + {if $customfields} +
+
+
+
+ {$LANG.additionalInfo|default:"Additional Information"} +
+
+
+
+ {foreach from=$customfields key=key item=field} + {if $key neq "Subdomain"} +
+
+ {$key} +
+ {if empty($field)} + {$LANG.blankCustomField|default:"Not Set"} + {else} + {$field} + {/if} +
+
+
+ {/if} + {/foreach} +
+
+
+
+ {/if} +
+ + +
+
+
+
+
+ {$LANG.cPanel.billingOverview|default:"Billing Overview"} +
+
+
+
+
+ {if $firstpaymentamount neq $recurringamount} +
+
+ {$LANG.firstpaymentamount|default:"First Payment"}: +
+
+ {$firstpaymentamount} +
+
+ {/if} + {if $billingcycle != $LANG.orderpaymenttermonetime && $billingcycle != $LANG.orderfree} +
+
+ {$LANG.recurringamount|default:"Recurring Amount"}: +
+
+ {$recurringamount} +
+
+ {/if} +
+
+ {$LANG.orderbillingcycle|default:"Billing Cycle"}: +
+
+ {$billingcycle} +
+
+
+
+ {$LANG.orderpaymentmethod|default:"Payment Method"}: +
+
+ {$paymentmethod} +
+
+
+
+
+
+ {$LANG.clientareahostingregdate|default:"Registration Date"}: +
+
+ {$regdate} +
+
+
+
+ {$LANG.clientareahostingnextduedate|default:"Next Due Date"}: +
+
+ {$nextduedate} +
+
+
+
+
+
+
+
+
diff --git a/TeaSpeak/servers/teamspeak/templates/settings.tpl b/TeaSpeak/servers/teamspeak/templates/settings.tpl new file mode 100644 index 0000000..145a5bf --- /dev/null +++ b/TeaSpeak/servers/teamspeak/templates/settings.tpl @@ -0,0 +1,43 @@ +  Back +
+
+
+
Configuration
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+
+ +
+
+
+
+
\ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/templates/tokens.tpl b/TeaSpeak/servers/teamspeak/templates/tokens.tpl new file mode 100644 index 0000000..fc34a57 --- /dev/null +++ b/TeaSpeak/servers/teamspeak/templates/tokens.tpl @@ -0,0 +1,80 @@ +  Back +
+
+
+
Privileges
+
+
+ + + + + +
+ + + + + + + + + + + + {if !empty($tokens)} + {assign var=var value=1} + {foreach $tokens as $token} + + + {foreach $sglist as $sg} + {if $sg.sgid eq $token.token_id1} + + {/if} + {/foreach} + + + + + {capture assign=var}{$var+1}{/capture} + {/foreach} + {else} + + + + {/if} + +
#Group's nameDate / TimeKeyOptions
{$var}{$sg.name}{$token.token_created|date_format:"%d-%m-%Y %H:%M:%S"}{$token.token} + +
There is no token
+
+
+
+
+ + + + +
+ + +
+ +
+ + + + +
+
+ +
+
\ No newline at end of file diff --git a/TeaSpeak/servers/teamspeak/templates/tsdns.tpl b/TeaSpeak/servers/teamspeak/templates/tsdns.tpl new file mode 100644 index 0000000..542877f --- /dev/null +++ b/TeaSpeak/servers/teamspeak/templates/tsdns.tpl @@ -0,0 +1,44 @@ +{if $systemStatus == 'Active' && $settings.enabletsdns eq 1} +   Back +
+
+
+
+

Edit Subdomain

+
+
+
+ + + + + +
+
+
+ + .{$settings.domaintsdns} +
+
+
+ +
+
+
+ +
+
+{else} +
+
+
  Back +

Oops! Something happens!

This option is disabled +
+
+
+{/if} \ No newline at end of file