WordPress Social Share, Social Login and Social Comments Plugin – Super Socializer - Version 7.12.38

Version Description

[14 February 2020] = * [Security] Temporarily removed LiveJournal from social login networks due to an authentication bypass vulnerability * [Improvement] Updated Twitter Auth library to latest version * [Improvement] Updated Vkontakte API to latest version 5.103 * [Improvement] Updated Google Auth library to latest version * [Improvement] Performance improvement * Removed Xing from social login networks * Removed Twitch from social login networks temporarily because the TwitchAuth 3rd party library being used is no longer maintained

Download this release

Release Info

Developer the_champ
Plugin Icon 128x128 WordPress Social Share, Social Login and Social Comments Plugin – Super Socializer
Version 7.12.38
Comparing to
See all releases

Code changes from version 7.12.37 to 7.12.38

Files changed (55) hide show
  1. admin/general_options.php +1 -4
  2. admin/like_buttons.php +1 -4
  3. admin/social_commenting.php +1 -4
  4. admin/social_login.php +1 -102
  5. admin/social_sharing.php +1 -4
  6. css/front.css +1 -1
  7. helper.php +8 -19
  8. images/roihunter.png +0 -0
  9. inc/shortcode.php +1 -1
  10. inc/social_login.php +2 -35
  11. js/front/combined.js +2 -2
  12. js/front/social_login/common.js +1 -1
  13. js/front/social_login/general.js +1 -1
  14. library/Facebook/Exceptions/FacebookResponseException.php +10 -1
  15. library/Facebook/Exceptions/FacebookResumableUploadException.php +35 -0
  16. library/Facebook/Facebook.php +1 -1
  17. library/Facebook/FileUpload/FacebookResumableUploader.php +10 -0
  18. library/Facebook/FileUpload/FacebookTransferChunk.php +8 -0
  19. library/Facebook/GraphNodes/GraphNodeFactory.php +3 -1
  20. library/Facebook/Helpers/FacebookRedirectLoginHelper.php +2 -2
  21. library/Facebook/Http/GraphRawResponse.php +3 -2
  22. library/LiveJournalLogin/class.openid.v3.php +0 -272
  23. library/LiveJournalLogin/index.php +0 -1
  24. library/Twitch/index.php +0 -1
  25. library/Twitch/twitch.php +0 -676
  26. library/Twitter/.gitignore +5 -0
  27. library/Twitter/.travis.yml +22 -0
  28. library/Twitter/CODE_OF_CONDUCT.md +46 -0
  29. library/Twitter/CONTRIBUTING.md +25 -0
  30. library/Twitter/LICENSE.md +22 -0
  31. library/Twitter/README.md +11 -0
  32. library/Twitter/autoload.php +35 -0
  33. library/Twitter/composer.json +34 -0
  34. library/Twitter/phpmd.xml +15 -0
  35. library/Twitter/phpunit.xml +11 -0
  36. library/Twitter/src/Config.php +107 -0
  37. library/Twitter/src/Consumer.php +36 -0
  38. library/Twitter/src/HmacSha1.php +39 -0
  39. library/Twitter/src/Request.php +262 -0
  40. library/Twitter/src/Response.php +107 -0
  41. library/Twitter/src/SignatureMethod.php +66 -0
  42. library/Twitter/src/Token.php +39 -0
  43. library/Twitter/src/TwitterOAuth.php +617 -0
  44. library/Twitter/src/TwitterOAuthException.php +10 -0
  45. library/Twitter/src/Util.php +115 -0
  46. library/Twitter/src/Util/JsonDecoder.php +26 -0
  47. library/Twitter/src/cacert.pem +3432 -0
  48. library/Vkontakte/Vkontakte.php +1 -1
  49. library/http.php +0 -2124
  50. library/oauth.php +0 -894
  51. library/oauth_client.php +0 -2758
  52. library/oauth_configuration.json +0 -393
  53. library/twitteroauth.php +0 -242
  54. readme.txt +33 -15
  55. super_socializer.php +29 -206
admin/general_options.php CHANGED
@@ -98,7 +98,6 @@ defined('ABSPATH') or die("Cheating........Uh!!");
98
  </div>
99
  </div>
100
  </div>
101
- <a href="https://easy.roihunter.com/?referralCode=KWna_YiwQ_Iic4_y1u2" target="_blank"><img style="width:800px" src="<?php echo plugins_url('../images/roihunter.png', __FILE__) ?>" /></a>
102
  </div>
103
  <?php include 'help.php'; ?>
104
  </form>
@@ -106,9 +105,7 @@ defined('ABSPATH') or die("Cheating........Uh!!");
106
  <div class="stuffbox">
107
  <h3><label><?php _e("Instagram Shoutout", 'super-socializer' ); ?></label></h3>
108
  <div class="inside" style="padding-left:7px">
109
- <p><?php _e( 'If you can send (to hello@heateor.com) how our plugin is helping your business, we can share it on Instagram. You can also send any relevant hashtags and people to mention in the Instagram post.', 'super-socializer' ) ?></p>
110
- <p><?php _e( '<b>Example</b> - Blah-Blah Online Coaching teaches various programming language courses through their website. They have emerged as one of the most popular online coaching websites in the past year. Anyone can become proficient in programming language of their choice in a very easy way in no time.', 'super-socializer' ) ?></p>
111
- <p><?php _e( '@blahblahonlinecoaching proudly use #SuperSocializer to enable social features at their website, such as - Social Login, Social Share and Social Commenting. Be sure to visit their website at blahblahonlinecoaching.com where you can browse a variety of programming language courses.', 'super-socializer' ) ?></p>
112
  </div>
113
  </div>
114
  </div>
98
  </div>
99
  </div>
100
  </div>
 
101
  </div>
102
  <?php include 'help.php'; ?>
103
  </form>
105
  <div class="stuffbox">
106
  <h3><label><?php _e("Instagram Shoutout", 'super-socializer' ); ?></label></h3>
107
  <div class="inside" style="padding-left:7px">
108
+ <p><?php _e( 'If you can send (to hello@heateor.com) how this plugin is helping your business, we would be glad to shoutout on Instagram. You can also send any relevant hashtags and people to mention in the Instagram post.', 'super-socializer' ) ?></p>
 
 
109
  </div>
110
  </div>
111
  </div>
admin/like_buttons.php CHANGED
@@ -803,15 +803,12 @@
803
  echo sprintf(__('You can appreciate the effort put in this free plugin by rating it <a href="%s" target="_blank">here</a>', 'super-socializer'), 'https://wordpress.org/support/view/plugin-reviews/super-socializer');
804
  ?>
805
  </div>
806
- <a href="https://easy.roihunter.com/?referralCode=KWna_YiwQ_Iic4_y1u2" target="_blank"><img style="width:800px;margin-top:7px;" src="<?php echo plugins_url('../images/roihunter.png', __FILE__) ?>" /></a>
807
  </form>
808
  <div class="clear"></div>
809
  <div class="stuffbox">
810
  <h3><label><?php _e("Instagram Shoutout", 'super-socializer'); ?></label></h3>
811
  <div class="inside" style="padding-left:10px">
812
- <p><?php _e( 'If you can send (to hello@heateor.com) how our plugin is helping your business, we can share it on Instagram. You can also send any relevant hashtags and people to mention in the Instagram post.', 'super-socializer') ?></p>
813
- <p><?php _e( '<b>Example</b> - Blah-Blah Online Coaching teaches various programming language courses through their website. They have emerged as one of the most popular online coaching websites in the past year. Anyone can become proficient in programming language of their choice in a very easy way in no time.', 'super-socializer') ?></p>
814
- <p><?php _e( '@blahblahonlinecoaching proudly use #SuperSocializer to enable social features at their website, such as - Social Login, Social Share and Social Commenting. Be sure to visit their website at blahblahonlinecoaching.com where you can browse a variety of programming language courses.', 'super-socializer') ?></p>
815
  </div>
816
  </div>
817
  </div>
803
  echo sprintf(__('You can appreciate the effort put in this free plugin by rating it <a href="%s" target="_blank">here</a>', 'super-socializer'), 'https://wordpress.org/support/view/plugin-reviews/super-socializer');
804
  ?>
805
  </div>
 
806
  </form>
807
  <div class="clear"></div>
808
  <div class="stuffbox">
809
  <h3><label><?php _e("Instagram Shoutout", 'super-socializer'); ?></label></h3>
810
  <div class="inside" style="padding-left:10px">
811
+ <p><?php _e( 'If you can send (to hello@heateor.com) how this plugin is helping your business, we would be glad to shoutout on Instagram. You can also send any relevant hashtags and people to mention in the Instagram post.', 'super-socializer' ) ?></p>
 
 
812
  </div>
813
  </div>
814
  </div>
admin/social_commenting.php CHANGED
@@ -404,15 +404,12 @@
404
  echo sprintf(__('You can appreciate the effort put in this free plugin by rating it <a href="%s" target="_blank">here</a>', 'super-socializer'), 'https://wordpress.org/support/view/plugin-reviews/super-socializer');
405
  ?>
406
  </div>
407
- <a href="https://easy.roihunter.com/?referralCode=KWna_YiwQ_Iic4_y1u2" target="_blank"><img style="width:800px;margin-top:7px;" src="<?php echo plugins_url('../images/roihunter.png', __FILE__) ?>" /></a>
408
  </form>
409
  <div class="clear"></div>
410
  <div class="stuffbox">
411
  <h3><label><?php _e("Instagram Shoutout", 'super-socializer' ); ?></label></h3>
412
  <div class="inside" style="padding-left:7px">
413
- <p><?php _e( 'If you can send (to hello@heateor.com) how our plugin is helping your business, we can share it on Instagram. You can also send any relevant hashtags and people to mention in the Instagram post.', 'super-socializer' ) ?></p>
414
- <p><?php _e( '<b>Example</b> - Blah-Blah Online Coaching teaches various programming language courses through their website. They have emerged as one of the most popular online coaching websites in the past year. Anyone can become proficient in programming language of their choice in a very easy way in no time.', 'super-socializer' ) ?></p>
415
- <p><?php _e( '@blahblahonlinecoaching proudly use #SuperSocializer to enable social features at their website, such as - Social Login, Social Share and Social Commenting. Be sure to visit their website at blahblahonlinecoaching.com where you can browse a variety of programming language courses.', 'super-socializer' ) ?></p>
416
  </div>
417
  </div>
418
  </div>
404
  echo sprintf(__('You can appreciate the effort put in this free plugin by rating it <a href="%s" target="_blank">here</a>', 'super-socializer'), 'https://wordpress.org/support/view/plugin-reviews/super-socializer');
405
  ?>
406
  </div>
 
407
  </form>
408
  <div class="clear"></div>
409
  <div class="stuffbox">
410
  <h3><label><?php _e("Instagram Shoutout", 'super-socializer' ); ?></label></h3>
411
  <div class="inside" style="padding-left:7px">
412
+ <p><?php _e( 'If you can send (to hello@heateor.com) how this plugin is helping your business, we would be glad to shoutout on Instagram. You can also send any relevant hashtags and people to mention in the Instagram post.', 'super-socializer' ) ?></p>
 
 
413
  </div>
414
  </div>
415
  </div>
admin/social_login.php CHANGED
@@ -123,23 +123,9 @@
123
  <label for="the_champ_login_instagram"><?php _e("Instagram", 'super-socializer'); ?></label>
124
  </div>
125
  <div class="theChampHorizontalSharingProviderContainer">
126
- <input id="the_champ_login_xing" name="the_champ_login[providers][]" type="checkbox" <?php echo isset($theChampLoginOptions['providers']) && in_array('xing', $theChampLoginOptions['providers']) ? 'checked = "checked"' : '';?> value="xing" />
127
- <label for="the_champ_login_xing"><?php _e("Xing", 'super-socializer'); ?></label>
128
- </div>
129
- <div class="theChampHorizontalSharingProviderContainer">
130
  <input id="the_champ_login_steam" name="the_champ_login[providers][]" type="checkbox" <?php echo isset($theChampLoginOptions['providers']) && in_array('steam', $theChampLoginOptions['providers']) ? 'checked = "checked"' : '';?> value="steam" />
131
  <label for="the_champ_login_steam"><?php _e("Steam", 'super-socializer'); ?></label>
132
  </div>
133
-
134
- <div class="theChampHorizontalSharingProviderContainer">
135
- <input id="the_champ_login_twitch" name="the_champ_login[providers][]" type="checkbox" <?php echo isset($theChampLoginOptions['providers']) && in_array('twitch', $theChampLoginOptions['providers']) ? 'checked = "checked"' : '';?> value="twitch" />
136
- <label for="the_champ_login_twitch"><?php _e("Twitch", 'super-socializer'); ?></label>
137
- </div>
138
-
139
- <div class="theChampHorizontalSharingProviderContainer">
140
- <input id="the_champ_login_livejournal" name="the_champ_login[providers][]" type="checkbox" <?php echo isset($theChampLoginOptions['providers']) && in_array('liveJournal', $theChampLoginOptions['providers']) ? 'checked = "checked"' : '';?> value="liveJournal" />
141
- <label for="the_champ_login_livejournal"><?php _e("LiveJournal", 'super-socializer'); ?></label>
142
- </div>
143
  </td>
144
  </tr>
145
 
@@ -389,48 +375,6 @@
389
  </div>
390
  </td>
391
  </tr>
392
-
393
- <tr>
394
- <th>
395
- <label for="the_champ_slxing_ck"><?php _e("Xing Consumer Key", 'super-socializer'); ?><img id="the_champ_slxing_ck_help" class="the_champ_help_bubble" src="<?php echo plugins_url('../images/info.png', __FILE__) ?>" /></label>
396
- </th>
397
- <td>
398
- <input id="the_champ_slxing_ck" name="the_champ_login[xing_ck]" type="text" value="<?php echo isset($theChampLoginOptions['xing_ck']) ? $theChampLoginOptions['xing_ck'] : '' ?>" />
399
- </td>
400
- </tr>
401
-
402
- <tr class="the_champ_help_content" id="the_champ_slxing_ck_help_cont">
403
- <td colspan="2">
404
- <div>
405
- <?php echo sprintf(__('Required for Xing Social Login to work. Please follow the documentation at <a href="%s" target="_blank">this link</a> to get Xing Consumer Key', 'super-socializer'), 'http://support.heateor.com/how-to-get-xing-consumer-key-and-secret/') ?>
406
- <br/>
407
- <span style="color: #14ACDF"><?php _e('Paste following url in <strong>Callback domain</strong> option mentioned at the link', 'super-socializer'); ?></span>
408
- <br/>
409
- <strong style="color: #14ACDF"><?php echo (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https://' : 'http://') . $_SERVER['HTTP_HOST']; ?></strong>
410
- </div>
411
- </td>
412
- </tr>
413
-
414
- <tr>
415
- <th>
416
- <label for="the_champ_slxing_cs"><?php _e("Xing Consumer Secret", 'super-socializer'); ?><img id="the_champ_slxing_cs_help" class="the_champ_help_bubble" src="<?php echo plugins_url('../images/info.png', __FILE__) ?>" /></label>
417
- </th>
418
- <td>
419
- <input id="the_champ_slxing_cs" name="the_champ_login[xing_cs]" type="text" value="<?php echo isset($theChampLoginOptions['xing_cs']) ? $theChampLoginOptions['xing_cs'] : '' ?>" />
420
- </td>
421
- </tr>
422
-
423
- <tr class="the_champ_help_content" id="the_champ_slxing_cs_help_cont">
424
- <td colspan="2">
425
- <div>
426
- <?php echo sprintf(__('Required for Xing Social Login to work. Please follow the documentation at <a href="%s" target="_blank">this link</a> to get Xing Consumer Secret', 'super-socializer'), 'http://support.heateor.com/how-to-get-xing-consumer-key-and-secret/') ?>
427
- <br/>
428
- <span style="color: #14ACDF"><?php _e('Paste following url in <strong>Callback domain</strong> option mentioned at the link', 'super-socializer'); ?></span>
429
- <br/>
430
- <strong style="color: #14ACDF"><?php echo (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https://' : 'http://') . $_SERVER['HTTP_HOST']; ?></strong>
431
- </div>
432
- </td>
433
- </tr>
434
 
435
  <tr>
436
  <th>
@@ -450,48 +394,6 @@
450
  </div>
451
  </td>
452
  </tr>
453
-
454
- <tr>
455
- <th>
456
- <label for="the_champ_sl_twitch_id"><?php _e("Twitch Client ID", 'super-socializer'); ?><img id="the_champ_sl_twitch_id_help" class="the_champ_help_bubble" src="<?php echo plugins_url('../images/info.png', __FILE__) ?>" /></label>
457
- </th>
458
- <td>
459
- <input id="the_champ_sl_twitch_id" name="the_champ_login[twitch_client_id]" type="text" value="<?php echo isset($theChampLoginOptions['twitch_client_id']) ? $theChampLoginOptions['twitch_client_id'] : '' ?>" />
460
- </td>
461
- </tr>
462
-
463
- <tr class="the_champ_help_content" id="the_champ_sl_twitch_id_help_cont">
464
- <td colspan="2">
465
- <div>
466
- <?php echo sprintf(__('Required for Twitch Social Login to work. Please follow the documentation at <a href="%s" target="_blank">this link</a> to get it', 'super-socializer'), 'http://support.heateor.com/how-to-enable-twitch-login-at-wordpress-website') ?>
467
- <br/>
468
- <span style="color: #14ACDF"><?php _e('Paste following url in <strong>Redirect URI</strong> option mentioned at the link', 'super-socializer'); ?></span>
469
- <br/>
470
- <strong style="color: #14ACDF"><?php echo esc_url(home_url()) . '/?SuperSocializerAuth=Twitch'; ?></strong>
471
- </div>
472
- </td>
473
- </tr>
474
-
475
- <tr>
476
- <th>
477
- <label for="the_champ_sl_twitch_secret"><?php _e("Twitch Client Secret", 'super-socializer'); ?><img id="the_champ_sl_twitch_secret_help" class="the_champ_help_bubble" src="<?php echo plugins_url('../images/info.png', __FILE__) ?>" /></label>
478
- </th>
479
- <td>
480
- <input id="the_champ_sl_twitch_secret" name="the_champ_login[twitch_client_secret]" type="text" value="<?php echo isset($theChampLoginOptions['twitch_client_secret']) ? $theChampLoginOptions['twitch_client_secret'] : '' ?>" />
481
- </td>
482
- </tr>
483
-
484
- <tr class="the_champ_help_content" id="the_champ_sl_twitch_secret_help_cont">
485
- <td colspan="2">
486
- <div>
487
- <?php echo sprintf(__('Required for Twitch Social Login to work. Please follow the documentation at <a href="%s" target="_blank">this link</a> to get it', 'super-socializer'), 'http://support.heateor.com/how-to-enable-twitch-login-at-wordpress-website') ?>
488
- <br/>
489
- <span style="color: #14ACDF"><?php _e('Paste following url in <strong>Redirect URI</strong> option mentioned at the link', 'super-socializer'); ?></span>
490
- <br/>
491
- <strong style="color: #14ACDF"><?php echo esc_url(home_url()) . '/?SuperSocializerAuth=Twitch'; ?></strong>
492
- </div>
493
- </td>
494
- </tr>
495
  </table>
496
  </div>
497
  </div>
@@ -1264,15 +1166,12 @@
1264
  echo sprintf(__('You can appreciate the effort put in this free plugin by rating it <a href="%s" target="_blank">here</a>', 'super-socializer'), 'https://wordpress.org/support/view/plugin-reviews/super-socializer');
1265
  ?>
1266
  </p>
1267
- <a href="https://easy.roihunter.com/?referralCode=KWna_YiwQ_Iic4_y1u2" target="_blank"><img style="width:800px;margin-top:7px;" src="<?php echo plugins_url('../images/roihunter.png', __FILE__) ?>" /></a>
1268
  </form>
1269
  <div class="clear"></div>
1270
  <div class="stuffbox">
1271
  <h3><label><?php _e("Instagram Shoutout", 'super-socializer'); ?></label></h3>
1272
  <div class="inside" style="padding-left:10px">
1273
- <p><?php _e('If you can send (to hello@heateor.com) how our plugin is helping your business, we can share it on Instagram. You can also send any relevant hashtags and people to mention in the Instagram post.', 'super-socializer') ?></p>
1274
- <p><?php _e('<b>Example</b> - Blah-Blah Online Coaching teaches various programming language courses through their website. They have emerged as one of the most popular online coaching websites in the past year. Anyone can become proficient in programming language of their choice in a very easy way in no time.', 'super-socializer') ?></p>
1275
- <p><?php _e('@blahblahonlinecoaching proudly use #SuperSocializer to enable social features at their website, such as - Social Login, Social Share and Social Commenting. Be sure to visit their website at blahblahonlinecoaching.com where you can browse a variety of programming language courses.', 'super-socializer') ?></p>
1276
  </div>
1277
  </div>
1278
  </div>
123
  <label for="the_champ_login_instagram"><?php _e("Instagram", 'super-socializer'); ?></label>
124
  </div>
125
  <div class="theChampHorizontalSharingProviderContainer">
 
 
 
 
126
  <input id="the_champ_login_steam" name="the_champ_login[providers][]" type="checkbox" <?php echo isset($theChampLoginOptions['providers']) && in_array('steam', $theChampLoginOptions['providers']) ? 'checked = "checked"' : '';?> value="steam" />
127
  <label for="the_champ_login_steam"><?php _e("Steam", 'super-socializer'); ?></label>
128
  </div>
 
 
 
 
 
 
 
 
 
 
129
  </td>
130
  </tr>
131
 
375
  </div>
376
  </td>
377
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
378
 
379
  <tr>
380
  <th>
394
  </div>
395
  </td>
396
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
397
  </table>
398
  </div>
399
  </div>
1166
  echo sprintf(__('You can appreciate the effort put in this free plugin by rating it <a href="%s" target="_blank">here</a>', 'super-socializer'), 'https://wordpress.org/support/view/plugin-reviews/super-socializer');
1167
  ?>
1168
  </p>
 
1169
  </form>
1170
  <div class="clear"></div>
1171
  <div class="stuffbox">
1172
  <h3><label><?php _e("Instagram Shoutout", 'super-socializer'); ?></label></h3>
1173
  <div class="inside" style="padding-left:10px">
1174
+ <p><?php _e( 'If you can send (to hello@heateor.com) how this plugin is helping your business, we would be glad to shoutout on Instagram. You can also send any relevant hashtags and people to mention in the Instagram post.', 'super-socializer' ) ?></p>
 
 
1175
  </div>
1176
  </div>
1177
  </div>
admin/social_sharing.php CHANGED
@@ -1967,15 +1967,12 @@
1967
  echo sprintf(__('You can appreciate the effort put in this free plugin by rating it <a href="%s" target="_blank">here</a>', 'super-socializer'), 'https://wordpress.org/support/view/plugin-reviews/super-socializer');
1968
  ?>
1969
  </div>
1970
- <a href="https://easy.roihunter.com/?referralCode=KWna_YiwQ_Iic4_y1u2" target="_blank"><img style="width:800px;margin-top:7px;" src="<?php echo plugins_url('../images/roihunter.png', __FILE__) ?>" /></a>
1971
  </form>
1972
  <div class="clear"></div>
1973
  <div class="stuffbox">
1974
  <h3><label><?php _e("Instagram Shoutout", 'super-socializer'); ?></label></h3>
1975
  <div class="inside" style="padding-left:10px">
1976
- <p><?php _e('If you can send (to hello@heateor.com) how our plugin is helping your business, we can share it on Instagram. You can also send any relevant hashtags and people to mention in the Instagram post.', 'super-socializer') ?></p>
1977
- <p><?php _e('<b>Example</b> - Blah-Blah Online Coaching teaches various programming language courses through their website. They have emerged as one of the most popular online coaching websites in the past year. Anyone can become proficient in programming language of their choice in a very easy way in no time.', 'super-socializer') ?></p>
1978
- <p><?php _e('@blahblahonlinecoaching proudly use #SuperSocializer to enable social features at their website, such as - Social Login, Social Share and Social Commenting. Be sure to visit their website at blahblahonlinecoaching.com where you can browse a variety of programming language courses.', 'super-socializer') ?></p>
1979
  </div>
1980
  </div>
1981
  </div>
1967
  echo sprintf(__('You can appreciate the effort put in this free plugin by rating it <a href="%s" target="_blank">here</a>', 'super-socializer'), 'https://wordpress.org/support/view/plugin-reviews/super-socializer');
1968
  ?>
1969
  </div>
 
1970
  </form>
1971
  <div class="clear"></div>
1972
  <div class="stuffbox">
1973
  <h3><label><?php _e("Instagram Shoutout", 'super-socializer'); ?></label></h3>
1974
  <div class="inside" style="padding-left:10px">
1975
+ <p><?php _e( 'If you can send (to hello@heateor.com) how this plugin is helping your business, we would be glad to shoutout on Instagram. You can also send any relevant hashtags and people to mention in the Instagram post.', 'super-socializer' ) ?></p>
 
 
1976
  </div>
1977
  </div>
1978
  </div>
css/front.css CHANGED
@@ -1 +1 @@
1
- @charset "utf-8";#the_champ_error{color:red;margin:7px 0}.the_champ_login_container{margin:2px 0}.the_champ_login_container img,.the_champ_sharing_container img{cursor:pointer;margin:2px;border:none}.the_champ_login_container img{display:none;float:left}#the_champ_loading_image{display:block!important;float:none}.the_champ_error{background-color:#FFFFE0;border:1px solid #E6DB55;padding:5px;margin:10px}#the_champ_sharing_more_providers{position:fixed;top:50%;left:47%;background:#FAFAFA;width:650px;margin:-180px 0 0 -300px;z-index:10000000;text-shadow:none!important;height:308px}#the_champ_popup_bg,#heateor_ss_browser_popup_bg,#heateor_ss_lj_popup_bg{background:url(../images/transparent_bg.png);bottom:0;display:block;left:0;position:fixed;right:0;top:0;z-index:10000}#the_champ_sharing_more_providers .title{font-size:14px!important;height:auto!important;background:#58B8F8!important;border-bottom:1px solid #D7D7D7!important;color:#fff;font-weight:700;letter-spacing:inherit;line-height:34px!important;padding:0!important;text-align:center;text-transform:none;margin:0!important;text-shadow:none!important;width:100%}#the_champ_sharing_more_providers *{font-family:Arial,Helvetica,sans-serif}#the_champ_sharing_more_providers #the_champ_sharing_more_content{background:#FAFAFA;border-radius:4px;color:#555;height:auto;width:100%}#the_champ_sharing_more_providers .filter{margin:0;padding:10px 0 0;position:relative;width:100%}#the_champ_sharing_more_providers .all-services{clear:both;height:250px;overflow:auto}#the_champ_sharing_more_content .all-services ul{margin:10px!important;overflow:hidden;list-style:none;padding-left:0!important;position:static!important;width:auto!important}#the_champ_sharing_more_content .all-services ul li{margin:0;background:0 0!important;float:left;width:33.3333%!important;text-align:left!important}#the_champ_sharing_more_providers .close-button img{margin:0;}#the_champ_sharing_more_providers .close-button.separated{background:0 0!important;border:none!important;box-shadow:none!important;width:auto!important;height:auto!important;z-index:1000}#the_champ_sharing_more_providers .close-button{height:auto!important;width:auto!important;left:auto!important;display:block!important;color:#555!important;cursor:pointer!important;font-size:29px!important;line-height:29px!important;margin:0!important;padding:0!important;position:absolute;right:-13px;top:-11px}#the_champ_sharing_more_providers .filter input.search{width:94%;display:block;float:none;font-family:"open sans","helvetica neue",helvetica,arial,sans-serif;font-weight:300;height:auto;line-height:inherit;margin:0 auto;padding:5px 8px 5px 10px;border:1px solid #ccc!important;color:#000;background:#FFF!important;font-size:16px!important;text-align:left!important}#the_champ_sharing_more_providers .footer-panel{background:#fff;border-top:1px solid #D7D7D7;padding:6px 0;width:100%;color:#fff}#the_champ_sharing_more_providers .footer-panel p{background-color:transparent;top:0;text-align:left!important;color:#000;font-family:'helvetica neue',arial,helvetica,sans-serif;font-size:12px;line-height:1.2;margin:0!important;padding:0 6px!important;text-indent:0!important}#the_champ_sharing_more_providers .footer-panel a{color:#fff;text-decoration:none;font-weight:700;text-indent:0!important}#the_champ_sharing_more_providers .all-services ul li a{border-radius:3px;color:#666!important;display:block;font-size:18px;height:auto;line-height:28px;overflow:hidden;padding:8px;text-decoration:none!important;text-overflow:ellipsis;white-space:nowrap;border:none!important;text-indent:0!important;background:0 0!important;text-shadow:none;box-shadow:none!important}.the_champ_share_count{display:block;text-indent:0!important;visibility:hidden;background-color:#58B8F8!important;width:5px;height:auto;text-align:center;min-width:8px!important;padding:1px 4px!important;color:#fff!important;font-family:'Open Sans',arial,sans-serif!important;font-size:10px!important;font-weight:600!important;-webkit-border-radius:15px!important;border-radius:15px!important;-webkit-box-shadow:0 2px 2px rgba(0,0,0,.4);box-shadow:0 2px 2px rgba(0,0,0,.4);text-shadow:0 -1px 0 rgba(0,0,0,.2);line-height:14px!important;border:2px solid #fff!important;z-index:1;margin:2px auto!important;box-sizing:content-box!important}.the_champ_share_count,.the_champ_vertical_counter,.the_champ_vertical_sharing{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important}ul.the_champ_login_ul,ul.the_champ_sharing_ul,ul.heateor_ss_follow_ul{list-style:none!important;padding-left:0!important}#the_champ_comment_toggle{margin-bottom:10px}ul.the_champ_login_ul{margin:3px 0!important}ul.the_champ_login_ul li{background:none;float:left;padding:0!important;margin:0!important;border:0!important;width:auto!important;clear:none!important;list-style-type:none!important}.theChampLoginSvg{-webkit-box-sizing:content-box;-moz-box-sizing:border-box;box-sizing:content-box;width:100%;height:100%;background-position:center!important}.theChampTwitchLoginSvg{background:url(data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20300%20300%22%3E%3Cpath%20d%3D%22M%2055%2030%20h%20200%20v%20160%20l%20-40%2040%20h%20-50%20l%20-40%2040%20v%20-40%20l%2030%20-30%20h%2060%20l%2020%20-20%20v%20-132%20h%20-165%20v%20152%20h%2055%20v%2070%20h%20-20%20v%20-40%20h%20-65%20v%20-160%20z%20M%20130%2090%20v%2060%20h%2015%20v%20-60%20z%20M%20185%2090%20v%2060%20h%2015%20v%20-60%20z%22%20stroke%3D%22%23fff%22%20stroke-width%3D%222%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E) left no-repeat}.theChampXingLoginSvg{background-size:109%!important;background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAzMCAzMCI+DQo8cGF0aCBkPSJNIDYgOSBoIDUgbCA0IDQgbCAtNSA3IGggLTUgbCA1IC03IHogbSAxNSAtNCBoIDUgbCAtOSAxMyBsIDQgOCBoIC01IGwgLTQgLTggeiIgZmlsbD0iI2ZmZiI+PC9wYXRoPg0KPC9zdmc+) left no-repeat}.theChampGoogleLoginSvg{background-size:111%!important;background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20viewBox%3D%22-8%20-8%2064%2064%22%3E%3Cdefs%3E%3Cpath%20id%3D%22a%22%20d%3D%22M44.5%2020H24v8.5h11.8C34.7%2033.9%2030.1%2037%2024%2037c-7.2%200-13-5.8-13-13s5.8-13%2013-13c3.1%200%205.9%201.1%208.1%202.9l6.4-6.4C34.6%204.1%2029.6%202%2024%202%2011.8%202%202%2011.8%202%2024s9.8%2022%2022%2022c11%200%2021-8%2021-22%200-1.3-.2-2.7-.5-4z%22%2F%3E%3C%2Fdefs%3E%3CclipPath%20id%3D%22b%22%3E%3Cuse%20xlink%3Ahref%3D%22%23a%22%20overflow%3D%22visible%22%2F%3E%3C%2FclipPath%3E%3Cpath%20clip-path%3D%22url(%23b)%22%20fill%3D%22%23FBBC05%22%20d%3D%22M0%2037V11l17%2013z%22%2F%3E%3Cpath%20clip-path%3D%22url(%23b)%22%20fill%3D%22%23EA4335%22%20d%3D%22M0%2011l17%2013%207-6.1L48%2014V0H0z%22%2F%3E%3Cpath%20clip-path%3D%22url(%23b)%22%20fill%3D%22%2334A853%22%20d%3D%22M0%2037l30-23%207.9%201L48%200v48H0z%22%2F%3E%3Cpath%20clip-path%3D%22url(%23b)%22%20fill%3D%22%234285F4%22%20d%3D%22M48%2048L17%2024l-4-3%2035-10z%22%2F%3E%3C%2Fsvg%3E') left no-repeat}.theChampLinkedinLoginSvg{background-size:121%!important;background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-1%200%2033%2035%22%3E%3Cpath%20d%3D%22M6.227%2012.61h4.19v13.48h-4.19V12.61zm2.095-6.7a2.43%202.43%200%200%201%200%204.86c-1.344%200-2.428-1.09-2.428-2.43s1.084-2.43%202.428-2.43m4.72%206.7h4.02v1.84h.058c.56-1.058%201.927-2.176%203.965-2.176%204.238%200%205.02%202.792%205.02%206.42v7.395h-4.183v-6.56c0-1.564-.03-3.574-2.178-3.574-2.18%200-2.514%201.7-2.514%203.46v6.668h-4.187V12.61z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E') left no-repeat}.theChampTwitterLoginSvg{background-size:120%!important;background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-2%20-2%2035%2035%22%3E%0A%3Cpath%20d%3D%22M28%208.557a9.913%209.913%200%200%201-2.828.775%204.93%204.93%200%200%200%202.166-2.725%209.738%209.738%200%200%201-3.13%201.194%204.92%204.92%200%200%200-3.593-1.55%204.924%204.924%200%200%200-4.794%206.049c-4.09-.21-7.72-2.17-10.15-5.15a4.942%204.942%200%200%200-.665%202.477c0%201.71.87%203.214%202.19%204.1a4.968%204.968%200%200%201-2.23-.616v.06c0%202.39%201.7%204.38%203.952%204.83-.414.115-.85.174-1.297.174-.318%200-.626-.03-.928-.086a4.935%204.935%200%200%200%204.6%203.42%209.893%209.893%200%200%201-6.114%202.107c-.398%200-.79-.023-1.175-.068a13.953%2013.953%200%200%200%207.55%202.213c9.056%200%2014.01-7.507%2014.01-14.013%200-.213-.005-.426-.015-.637.96-.695%201.795-1.56%202.455-2.55z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%0A%3C%2Fsvg%3E') left no-repeat}.theChampVkontakteLoginSvg{background-size:114%!important;background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%221%202%2030%2028%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23fff%22%20d%3D%22M15.764%2022.223h1.315s.394-.044.6-.262c.184-.2.18-.574.18-.574s-.03-1.764.79-2.023c.81-.255%201.844%201.705%202.942%202.46.832.57%201.464.445%201.464.445l2.936-.04s1.538-.097.81-1.304c-.06-.1-.426-.894-2.186-2.526-1.843-1.71-1.594-1.434.624-4.39%201.353-1.804%201.893-2.902%201.724-3.374-.16-.45-1.153-.33-1.153-.33l-3.306.02s-.247-.034-.428.074c-.178.108-.293.356-.293.356s-.522%201.394-1.223%202.58c-1.47%202.5-2.06%202.633-2.3%202.476-.563-.36-.42-1.454-.42-2.23%200-2.423.365-3.435-.72-3.696-.357-.085-.623-.143-1.544-.15-1.182-.014-2.18.003-2.743.28-.378.185-.667.595-.49.62.218.027.713.13.975.49.34.46.33%201.496.33%201.496s.193%202.852-.46%203.206c-.442.245-1.056-.252-2.37-2.52-.67-1.163-1.18-2.446-1.18-2.446s-.1-.24-.273-.37c-.212-.155-.506-.204-.506-.204l-3.145.02s-.473.015-.647.22c-.154.183-.01.56-.01.56s2.46%205.757%205.245%208.657c2.553%202.66%205.454%202.485%205.454%202.485z%22%2F%3E%3C%2Fsvg%3E') left no-repeat}.theChampFacebookLoginSvg{background-size:116%!important;padding-left:8px;padding-top:5px;background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-3%20-3%2038%2038%22%3E%3Cpath%20d%3D%22M17.78%2027.5V17.008h3.522l.527-4.09h-4.05v-2.61c0-1.182.33-1.99%202.023-1.99h2.166V4.66c-.375-.05-1.66-.16-3.155-.16-3.123%200-5.26%201.905-5.26%205.405v3.016h-3.53v4.09h3.53V27.5h4.223z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') left no-repeat}.theChampLiveJournalLoginSvg{background-size:111%!important;background:url(data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2032%2032%22%3E%3Cg%20fill%3D%22%2300B0EA%22%3E%3Cpath%20d%3D%22M16.76%205.53c-1.586%200-3.094.33-4.462.922l-2.47-2.465h-.005A11.268%2011.268%200%200%200%204%209.843l2.472%202.47a11.283%2011.283%200%200%201%205.823-5.86h.004l9.14%209.128h-.006a11.304%2011.304%200%200%200-5.823%205.86l-9.14-9.13c-.597%201.372-.952%202.865-.952%204.457%200%206.21%205.03%2011.24%2011.24%2011.24S28%2022.98%2028%2016.77c0-6.206-5.033-11.24-11.24-11.24zm1.95%2016.573a6.561%206.561%200%200%201%203.38-3.403l.887%204.285-4.268-.882z%22%2F%3E%3Cpath%20d%3D%22M22.092%2018.702l-.653-3.118h-.007a11.288%2011.288%200%200%200-5.822%205.858l3.097.66a6.58%206.58%200%200%201%203.38-3.4%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E) left no-repeat}.theChampSteamLoginSvg{background:url(data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20300%20300%22%3E%3Ccircle%20cx%3D%2245%22%20cy%3D%22130%22%20r%3D%2225%22%20stroke%3D%22%23fff%22%20stroke-width%3D%227%22%20fill%3D%22none%22%3E%3C%2Fcircle%3E%3Ccircle%20cx%3D%22155%22%20cy%3D%22198%22%20r%3D%2225%22%20stroke%3D%22%23fff%22%20stroke-width%3D%227%22%20fill%3D%22none%22%3E%3C%2Fcircle%3E%3Ccircle%20cx%3D%22245%22%20cy%3D%22110%22%20r%3D%2235%22%20stroke%3D%22%23fff%22%20stroke-width%3D%2210%22%20fill%3D%22none%22%3E%3C%2Fcircle%3E%3Ccircle%20cx%3D%22245%22%20cy%3D%22110%22%20r%3D%2215%22%20stroke%3D%22%23fff%22%20stroke-width%3D%2210%22%20fill%3D%22%23fff%22%3E%3C%2Fcircle%3E%3Cpath%20d%3D%22M%20160%20170%20l%2045%20-64%20l%2040%2044%20l%20-62%2044%22%20stroke%3D%22%23fff%22%20stroke-width%3D%221%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3Cpath%20d%3D%22M%2045%20130%20l%20110%2068%22%20stroke%3D%22%23fff%22%20stroke-width%3D%2230%22%20fill%3D%22%23fff%22%20stroke-linecap%3D%22round%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E) left no-repeat}.theChampInstagramLoginSvg{background-size:105%!important;background:url(data:image/svg+xml;charset=utf8,%3Csvg%20enable-background%3D%22new%200%200%20128%20128%22%20id%3D%22Layer_1%22%20version%3D%221.1%22%20viewBox%3D%220%200%20128%20128%22%20xml%3Aspace%3D%22preserve%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cg%3E%3Cg%3E%3Cpath%20d%3D%22M86%2C112H42c-14.336%2C0-26-11.663-26-26V42c0-14.337%2C11.664-26%2C26-26h44c14.337%2C0%2C26%2C11.663%2C26%2C26v44%20%20%20%20C112%2C100.337%2C100.337%2C112%2C86%2C112z%20M42%2C24c-9.925%2C0-18%2C8.074-18%2C18v44c0%2C9.925%2C8.075%2C18%2C18%2C18h44c9.926%2C0%2C18-8.075%2C18-18V42%20%20%20%20c0-9.926-8.074-18-18-18H42z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3Cg%3E%3Cpath%20d%3D%22M64%2C88c-13.234%2C0-24-10.767-24-24c0-13.234%2C10.766-24%2C24-24s24%2C10.766%2C24%2C24C88%2C77.233%2C77.234%2C88%2C64%2C88z%20M64%2C48c-8.822%2C0-16%2C7.178-16%2C16s7.178%2C16%2C16%2C16c8.822%2C0%2C16-7.178%2C16-16S72.822%2C48%2C64%2C48z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3Cg%3E%3Ccircle%20cx%3D%2289.5%22%20cy%3D%2238.5%22%20fill%3D%22%23fff%22%20r%3D%225.5%22%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E) left no-repeat}.theChampLoginButton{background:url(../images/login/login.png) no-repeat}.theChampLogin{padding:0!important;margin:2px;height:35px;width:35px;float:left;cursor:pointer;border:none}.theChampInstagramLogin,.theChampTwitterLogin,.theChampXingLogin{display:block}.theChampXingButton{background-position:-64px 0;width:32px;height:32px;display:block}.theChampFacebookButton{background-position:0 0;width:32px;height:32px;display:none}.theChampLiveButton{background-position:-32px -96px;width:32px;height:32px;display:block}.theChampGoogleButton{background-position:-32px 0;width:32px;height:32px;display:none}.theChampInstagramButton{background-position:0 -32px;width:32px;height:32px;display:block!important}.theChampLinkedinButton{background-position:-32px -32px;width:32px;height:32px;display:none}.theChampTwitterButton{background-position:0 -64px;width:32px;height:32px;display:block!important}.theChampVkontakteButton{background-position:-32px -64px;width:32px;height:32px;display:none}ul.the_champ_sharing_ul,ul.heateor_ss_follow_ul{margin:1px 0!important}#heateor_ss_lj_popup_close img,#the_champ_sharing_popup_close img{opacity: 1!important;background:0 0!important;border:none!important;outline:0!important;box-shadow:none!important;width:auto!important;height:auto!important;top:inherit!important;right:inherit!important;left:9px!important;padding:0!important}ul.the_champ_sharing_ul li.theChampSharingRound,ul.heateor_ss_follow_ul li.theChampSharingRound{background:0 0!important}.the_champ_square_count{display:none;text-align:center;font-weight:bolder;font-family:sans-serif;font-style: normal;font-size: .8em;visibility:hidden;word-wrap:normal!important}ul.heateor_ss_follow_ul li{width:auto;}ul.heateor_ss_follow_ul li,ul.the_champ_sharing_ul li{float:left!important;margin:0!important;padding:0!important;list-style:none!important;border:none!important;clear:none;}.theChampSharing{display:block;cursor:pointer;margin:2px}ul.the_champ_login_ul li:before,ul.the_champ_sharing_ul li:before,ul.heateor_ss_follow_ul li:before{content:none!important}.theChampSharingDeliciousButton{background-position:0 0;width:32px;height:32px}.theChampSharingDiggButton{background-position:-32px 0;width:32px;height:32px}.theChampSharingEmailButton{background-position:-64px 0;width:32px;height:32px}.theChampSharingXingButton{background-position:0 -128px;width:32px;height:32px}.theChampSharingWhatsappButton{background-position:-32px -128px;width:32px;height:32px}.theChampSharingYummlyButton{background-position:-64px -128px;width:32px;height:32px}.theChampSharingBufferButton{background-position:-96px -128px;width:32px;height:32px}.theChampSharingTotalsharesButton{background-position: -200px -200px}.theChampSharingFacebookButton{background-position:-96px 0;width:32px;height:32px}.theChampSharingFloatitButton{background-position:0 -32px;width:32px;height:32px}.theChampSharingGoogleButton{background-position:-32px -32px;width:32px;height:32px}.theChampSharingLinkedinButton{background-position:-64px -32px;width:32px;height:32px}.theChampSharingMoreButton{background-position:-96px -32px;width:32px;height:32px}.theChampSharingPinterestButton{background-position:0 -64px;width:32px;height:32px}.theChampSharingPrintButton{background-position:-32px -64px;width:32px;height:32px}.theChampSharingRedditButton{background-position:-64px -64px;width:32px;height:32px}.theChampSharingStumbleuponButton{background-position:-96px -64px;width:32px;height:32px}.theChampSharingTumblrButton{background-position:0 -96px;width:32px;height:32px}.theChampSharingTwitterButton{background-position:-32px -96px;width:32px;height:32px}.theChampSharingVkontakteButton{background-position:-64px -96px;width:32px;height:32px}.theChampSharingYahooButton{background-position:-96px -96px;width:32px;height:32px}.the_champ_vertical_counter,.the_champ_vertical_sharing{background:0 0;-webkit-box-shadow:0 1px 4px 1px rgba(0,0,0,.1);box-shadow:0 1px 4px 1px rgba(0,0,0,.1);position:fixed;overflow:visible;z-index:10000000;display:block;padding:10px;border-radius:4px;opacity:1;box-sizing:content-box!important}.the_champ_vertical_counter li{clear:both}li.the_champ_facebook_share .fb-share-button span,li.the_champ_facebook_like .fb-like span,li.the_champ_facebook_recommend .fb-like span{vertical-align:top!important}li.the_champ_facebook_like .fb-like span iframe,li.the_champ_facebook_recommend .fb-like span iframe{max-width:none!important;z-index:1000}div.the_champ_horizontal_sharing li{width:auto}div.the_champ_horizontal_sharing li.the_champ_facebook_share, div.the_champ_horizontal_counter li.the_champ_facebook_share{width:76px}div.the_champ_horizontal_sharing li.the_champ_facebook_like, div.the_champ_horizontal_counter li.the_champ_facebook_like{width:56px}div.the_champ_horizontal_sharing li.the_champ_facebook_recommend, div.the_champ_horizontal_counter li.the_champ_facebook_recommend{width:111px}div.the_champ_horizontal_sharing li.the_champ_twitter_tweet, div.the_champ_horizontal_counter li.the_champ_twitter_tweet{width:65px}div.the_champ_horizontal_counter li.the_champ_linkedin_share span, div.the_champ_horizontal_sharing li.the_champ_linkedin_share span{vertical-align:text-top!important}div.the_champ_horizontal_sharing li.the_champ_buffer_share{width:89px}div.the_champ_horizontal_sharing li.the_champ_linkedin_share, div.the_champ_horizontal_counter li.the_champ_linkedin_share{width:67px}div.the_champ_horizontal_sharing li.the_champ_buffer, div.the_champ_horizontal_counter li.the_champ_buffer{width:81px;}div.the_champ_horizontal_sharing li.the_champ_reddit, div.the_champ_horizontal_counter li.the_champ_reddit{width:124px}div.the_champ_horizontal_sharing li.the_champ_yummly, div.the_champ_horizontal_counter li.the_champ_yummly{width:61px}div.the_champ_horizontal_sharing li.the_champ_pinterest_pin, div.the_champ_horizontal_counter li.the_champ_pinterest_pin{width:58px}div.the_champ_horizontal_counter li.the_champ_pinterest_pin{line-height:1px}div.the_champ_horizontal_sharing li.the_champ_xing, div.the_champ_horizontal_counter li.the_champ_xing{width:67px}.the_champ_counter_container li{height:21px}input#user_login,input#user_pass{height:auto!important}.theChampHorizontalSharingButton,.theChampVerticalSharingButton{display:block}.theChampInstagramBackground{background: radial-gradient(circle at 30% 107%, #fdf497 0%, #fdf497 5%, #fd5949 45%,#d6249f 60%,#285AEB 90%)}.theChampYummlyBackground{background-color:#E16120}.theChampBufferBackground{background-color:#000}.theChampFacebookBackground{background-color:#4267B2}.theChampSteamBackground{background-color:#393939}.theChampLiveJournalBackground{background-color:#EDEDED}.theChampDiggBackground{background-color:#006094}.theChampEmailBackground{background-color:#649A3F}.theChampFloatitBackground{background-color:#53BEEE}.theChampGoogleBackground{background-color:white;box-sizing:border-box;border:1px #4184F3 solid}.theChampTwitchBackground{background-color:#6441A5}.theChampLinkedinBackground{background-color:#0077B5}.theChampMoreBackground{background-color:#EE8E2D}.theChampPinterestBackground{background-color:#CC2329}.theChampPrintBackground{background-color:#FD6500}.theChampRedditBackground{background-color:#FF5700}.theChampStockTwitsBackground{background-color: #40576F}.theChampTumblrBackground{background-color:#29435D}.theChampTwitterBackground{background-color:#55acee}.theChampVkontakteBackground{background-color:#5E84AC}.theChampXingBackground{background-color:#00797D}.theChampWhatsappBackground{background-color:#55EB4C}.theChampMeWeBackground{background-color:#007da1}.theChampMixBackground{background-color:#ff8226}.theChampTCBackground,.theChampTCBackground:hover{border-width: 0!important;background-color:transparent;}.theChampTCBackground{background-color:transparent!important;font-style:normal!important;word-wrap:normal;color:#666;line-height:1;visibility:hidden;}.theChampSharingTotalsharesButton{font-style:normal!important;word-wrap:normal;color:#666;line-height:1}.theChampSharingSvg{width:100%;height:100%}.theChampYummlySvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%220%200%2030%2030%22%3E%3Cpath%20stroke%3D%22%23fff%22%20d%3D%22M%2010.5%2010%20q%204%20-2%202.5%201%20l%20-1%204%20q%200%202%205%200%20l%201%20-6.5%20m%20-1%206.5%20l%20-1%204%20c%20-3%206%20-6%20-1%200%20-1%20q%201%20-1%205%201%22%20stroke-width%3D%222%22%20fill%3D%22none%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampBufferSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-4%20-4%2038%2039%22%3E%3Cpath%20stroke%3D%22%23fff%22%20d%3D%22M%2015%206%20l%20-10%205%20l%2010%205%20l%2010%20-5%20z%22%20stroke-width%3D%220%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3Cpath%20stroke%3D%22%23fff%22%20d%3D%22M%205.5%2014.5%20l%209.5%205%20l%209.5%20-5%20m%20-19%204%20l%209.5%205%20l%209.5%20-5%22%20stroke-width%3D%222%22%20fill%3D%22none%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampFacebookSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-5%20-5%2042%2042%22%3E%3Cpath%20d%3D%22M17.78%2027.5V17.008h3.522l.527-4.09h-4.05v-2.61c0-1.182.33-1.99%202.023-1.99h2.166V4.66c-.375-.05-1.66-.16-3.155-.16-3.123%200-5.26%201.905-5.26%205.405v3.016h-3.53v4.09h3.53V27.5h4.223z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampDiggSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-5%20-5%2049%2049%22%3E%3Cpath%20d%3D%22M%206%2020%20h%2010%20c%200%20-14%20-9%20-14%20-9%200%20m%205%200%20v%207%20m%20-1%200%20v%20-7%20m%204%20-7%20h%204.5%20v%20-5%20h%208%20v%208%20h%20-8%20v%20-3%20m%208%200%20h%204%20v%205.5%20h%20-3%20v%2012%20h%20-4%20v%20-8%20m%200%208%20h%20-6.5%20v%20-12%20h%20-2%22%20stroke-width%3D%222%22%20stroke%3D%22%23fff%22%20fill%3D%22none%22%3E%3C%2Fpath%3E%3Cellipse%20cx%3D%2211.5%22%20cy%3D%2228.5%22%20rx%3D%224%22%20ry%3D%222%22%20style%3D%22fill%3A%23fff%3B%22%3E%3C%2Fellipse%3E%3C%2Fsvg%3E') no-repeat center center}.theChampEmailSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-4%20-4%2043%2043%22%3E%3Cpath%20d%3D%22M%205.5%2011%20h%2023%20v%201%20l%20-11%206%20l%20-11%20-6%20v%20-1%20m%200%202%20l%2011%206%20l%2011%20-6%20v%2011%20h%20-22%20v%20-11%22%20stroke-width%3D%221%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampFloatitSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-3%20-3%2038%2038%22%3E%3Cg%20fill%3D%22%23fff%22%3E%3Cpath%20d%3D%22M16%203C8.814%203%203%208.814%203%2016s5.814%2013%2013%2013%2013-5.814%2013-13S23.187%203%2016%203zm0%2025.152c-6.712%200-12.153-5.44-12.153-12.152C3.847%209.288%209.287%203.848%2016%203.848S28.152%209.288%2028.152%2016c0%206.712-5.44%2012.152-12.152%2012.152z%22%2F%3E%3Cpath%20d%3D%22M22.406%2016A6.402%206.402%200%200%200%2016%209.593%206.402%206.402%200%200%200%209.593%2016%206.4%206.4%200%200%200%2016%2022.406%206.4%206.4%200%200%200%2022.406%2016zM16%2021.39A5.392%205.392%200%200%201%2010.61%2016%205.403%205.403%200%200%201%2016%2010.61%205.393%205.393%200%200%201%2021.39%2016%205.382%205.382%200%200%201%2016%2021.39z%22%2F%3E%3Cpath%20d%3D%22M13.763%209.187V4.864c-4.475.9-8%204.424-8.898%208.898h4.322a7.226%207.226%200%200%201%204.576-4.575zm9.05%204.576h4.32c-.896-4.475-4.422-8-8.896-8.898v4.322a7.224%207.224%200%200%201%204.575%204.576zm-4.576%209.052v4.322c4.475-.9%208-4.424%208.897-8.9h-4.322a7.232%207.232%200%200%201-4.575%204.578zm-9.05-4.578H4.863c.898%204.475%204.424%208%208.898%208.9v-4.323a7.233%207.233%200%200%201-4.574-4.577z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E') no-repeat center center}.theChampGoogleSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBkPSJNIDUxLjIyODc3NjYwNTc1NzA3IDM4LjE5MDgwNzcwMjE5NzA1IEEgMTcgMTcgMCAxIDAgNTYgNTAuMDAwMDAwMDAwMDAwMDEgaCAtMTciIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSI4IiBmaWxsPSJub25lIj48L3BhdGg+PHBhdGggZD0iTSA2NSA0OSBoIDE4IG0gLTkgLTkgdiAxOCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjUiIGZpbGw9Im5vbmUiPjwvcGF0aD48L3N2Zz4=) left no-repeat}.theChampLinkedinSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-2%20-2%2035%2039%22%3E%3Cpath%20d%3D%22M6.227%2012.61h4.19v13.48h-4.19V12.61zm2.095-6.7a2.43%202.43%200%200%201%200%204.86c-1.344%200-2.428-1.09-2.428-2.43s1.084-2.43%202.428-2.43m4.72%206.7h4.02v1.84h.058c.56-1.058%201.927-2.176%203.965-2.176%204.238%200%205.02%202.792%205.02%206.42v7.395h-4.183v-6.56c0-1.564-.03-3.574-2.178-3.574-2.18%200-2.514%201.7-2.514%203.46v6.668h-4.187V12.61z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E') no-repeat center center}.theChampMediumSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20focusable%3D%22false%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-2%20-2%2036%2036%22%3E%3Cpath%20d%3D%22M7.8%2011a.8.8%200%200%200-.27-.7l-2-2.42v-.41h6.23L16.57%2018l4.24-10.53h5.94v.36L25%209.47a.5.5%200%200%200-.19.48v12.1a.5.5%200%200%200%20.19.48l1.68%201.64v.36h-8.4v-.36L20%2022.49c.18-.17.18-.22.18-.49v-9.77l-4.82%2012.26h-.65L9.09%2012.23v8.22a1.09%201.09%200%200%200%20.31.94l2.25%202.74v.36h-6.4v-.36l2.26-2.74a1.09%201.09%200%200%200%20.29-.94z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampOdnoklassnikiSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-4%20-4%2040%2040%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M16%2016.16c-3.635%200-6.58-2.945-6.58-6.58C9.42%205.945%2012.364%203%2016%203s6.582%202.945%206.582%206.58c0%203.635-2.946%206.58-6.58%206.58zm0-9.817c-1.788%200-3.236%201.448-3.236%203.237%200%201.79%201.448%203.236%203.237%203.236%201.79%200%203.24-1.447%203.24-3.236%200-1.79-1.45-3.237-3.238-3.237zm7.586%2010.62c.648%201.3-.084%201.93-1.735%202.99-1.397.9-3.315%201.238-4.566%201.368l1.048%201.05%203.877%203.877c.59.59.59%201.544%200%202.134l-.178.18c-.59.59-1.544.59-2.134%200l-3.878-3.88-3.878%203.88c-.59.59-1.543.59-2.135%200l-.176-.18c-.59-.59-.59-1.543%200-2.132l3.878-3.878%201.043-1.046c-1.25-.127-3.19-.465-4.6-1.37-1.65-1.062-2.38-1.69-1.733-2.99.37-.747%201.4-1.367%202.768-.29C13.035%2018.13%2016%2018.13%2016%2018.13s2.968%200%204.818-1.456c1.37-1.077%202.4-.457%202.768.29z%22%2F%3E%3C%2Fsvg%3E') no-repeat center center}.theChampMoreSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii00IC00IDM4IDM4Ij48Y2lyY2xlIGN4PSIxMCIgY3k9IjE1IiByPSIzIiBmaWxsPSJ3aGl0ZSI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iMjAiIGN5PSIxMCIgcj0iMyIgZmlsbD0id2hpdGUiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjIwIiBjeT0iMjAiIHI9IjMiIGZpbGw9IndoaXRlIj48L2NpcmNsZT48cGF0aCBkPSJNIDEwIDE1IEwgMjAgMTAgbSAwIDEwIEwgMTAgMTUiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSIjZmZmIj48L3BhdGg+PC9zdmc+) left no-repeat}.theChampPinterestSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-2%20-2%2035%2035%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M16.539%204.5c-6.277%200-9.442%204.5-9.442%208.253%200%202.272.86%204.293%202.705%205.046.303.125.574.005.662-.33.061-.231.205-.816.27-1.06.088-.331.053-.447-.191-.736-.532-.627-.873-1.439-.873-2.591%200-3.338%202.498-6.327%206.505-6.327%203.548%200%205.497%202.168%205.497%205.062%200%203.81-1.686%207.025-4.188%207.025-1.382%200-2.416-1.142-2.085-2.545.397-1.674%201.166-3.48%201.166-4.689%200-1.081-.581-1.983-1.782-1.983-1.413%200-2.548%201.462-2.548%203.419%200%201.247.421%202.091.421%202.091l-1.699%207.199c-.505%202.137-.076%204.755-.039%205.019.021.158.223.196.314.077.13-.17%201.813-2.247%202.384-4.324.162-.587.929-3.631.929-3.631.46.876%201.801%201.646%203.227%201.646%204.247%200%207.128-3.871%207.128-9.053.003-3.918-3.317-7.568-8.361-7.568z%22%2F%3E%3C%2Fsvg%3E') no-repeat center center}.theChampPrintSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii00IC02IDM4IDM4Ij48cGF0aCBzdHJva2U9IiNmZmYiIGQ9Ik0gNyAxMCBoIDIgdiAzIGggMTIgdiAtMyBoIDIgdiA3IGggLTIgdiAtMyBoIC0xMiB2IDMgaCAtMiB6IiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9IiNmZmYiPjwvcGF0aD48cmVjdCBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS44IiBoZWlnaHQ9IjciIHdpZHRoPSIxMCIgeD0iMTAiIHk9IjUiIGZpbGw9Im5vbmUiPjwvcmVjdD48cmVjdCBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMSIgaGVpZ2h0PSI1IiB3aWR0aD0iOCIgeD0iMTEiIHk9IjE2IiBmaWxsPSIjZmZmIj48L3JlY3Q+PC9zdmc+) left no-repeat}.theChampRedditSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii02IC02IDQyIDQyIj48ZWxsaXBzZSBjeD0iMTUiIGN5PSIxOSIgcng9IjkiIHJ5PSI3IiBzdHlsZT0ic3Ryb2tlOndoaXRlO3N0cm9rZS13aWR0aDoyIiBmaWxsPSJub25lIj48L2VsbGlwc2U+PGNpcmNsZSBjeD0iMTEiIGN5PSIxNyIgcj0iMiIgZmlsbD0id2hpdGUiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjE5IiBjeT0iMTciIHI9IjIiIGZpbGw9IndoaXRlIj48L2NpcmNsZT48Y2lyY2xlIGN4PSIyMiIgY3k9IjciIHI9IjIiIGZpbGw9IndoaXRlIj48L2NpcmNsZT48Y2lyY2xlIGN4PSI3IiBjeT0iMTQiIHI9IjIiIGZpbGw9IndoaXRlIj48L2NpcmNsZT48Y2lyY2xlIGN4PSIyMyIgY3k9IjE0IiByPSIyIiBmaWxsPSJ3aGl0ZSI+PC9jaXJjbGU+PHBhdGggZD0iTSAxMCAyMiBxIDUgMyAxMCAwIE0gMTUgMTIgbCAxIC02IGwgNiAxIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZT0iI2ZmZiIgZmlsbD0ibm9uZSI+PC9wYXRoPjwvc3ZnPg==) left no-repeat}.theChampTumblrSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii00IC00IDM4IDM4Ij48cGF0aCBkPSJNIDE0IDcgdiAxNCBxIDMgMiA2IDAgTSAxNCA3LjUgcSAwIDUuNSAtNCA1LjUgaCA5IiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZT0iI2ZmZiIgZmlsbD0ibm9uZSI+PC9wYXRoPjwvc3ZnPg==) left no-repeat}.theChampTwitterSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii04IC04IDY0IDY0Ij4NCjxwYXRoIGQ9Ik0gMzggMTkgcSAyIC0xIDQgLTUgcSAtMS41IDIgLTQgMiBxIDEuNSAtMSAzLjUgLTUgcSAtMS41IDIgLTUgMiBjIC01IC01IC0xMyAtMiAtMTIgNiBxIC03IDEgLTE1IC04IHEgLTIgNCAxIDkgcSAtMSAwIC0zIC0xIHEgMCA1IDUgNyBxIC0xIC41IC0zIDAgcSAxIDQgOCA2IHEgLTUgMyAtMTEgMyBjIDE0IDggMzAgMCAzMS41IC0xNCIgc3Ryb2tlLXdpZHRoPSIwLjMiIGZpbGw9IiNmZmYiPjwvcGF0aD4NCjwvc3ZnPg==) left no-repeat}.theChampVkontakteSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii01IC01IDQwIDQwIj4NCjxwYXRoIGQ9Ik0gMi41IDkgaCA0LjUgbCA1IDcgdiAtNyBoIDQuNSB2IDcgbCA1IC03IGggNSBsIC01IDcgbCA1IDcgaCAtNSBsIC01IC03IHYgNyBoIC00LjUgcSAtMiAwIC01IC02IHoiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0iI2ZmZiI+PC9wYXRoPg0KPC9zdmc+) left no-repeat}.theChampXingSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii02IC02IDQyIDQyIj4NCjxwYXRoIGQ9Ik0gNiA5IGggNSBsIDQgNCBsIC01IDcgaCAtNSBsIDUgLTcgeiBtIDE1IC00IGggNSBsIC05IDEzIGwgNCA4IGggLTUgbCAtNCAtOCB6IiBmaWxsPSIjZmZmIj48L3BhdGg+DQo8L3N2Zz4=) left no-repeat}.theChampWhatsappSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii01IC01IDQwIDQwIj48cGF0aCBpZD0iYXJjMSIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiIGQ9Ik0gMTEuNTc5Nzk4NTY2NzQzMzE0IDI0LjM5NjkyNjIwNzg1OTA4NSBBIDEwIDEwIDAgMSAwIDYuODA4NDc5NTU3MTEwMDc5IDIwLjczNTc2NDM2MzUxMDQ2Ij48L3BhdGg+PHBhdGggZD0iTSA3IDE5IGwgLTEgNiBsIDYgLTEiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIj48L3BhdGg+PHBhdGggZD0iTSAxMCAxMCBxIC0xIDggOCAxMSBjIDUgLTEgMCAtNiAtMSAtMyBxIC00IC0zIC01IC01IGMgNCAtMiAtMSAtNSAtMSAtNCIgZmlsbD0iI2ZmZiI+PC9wYXRoPjwvc3ZnPg==) left no-repeat}.theChampSharing{float:left;border:none}.theChampSharingArrow{height:16px;width:16px;cursor:pointer;margin-top:10px}.theChampPushIn{background:url(data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%220%200%2030%2030%22%3E%0A%3Cpath%20d%3D%22M%207%206%20q%202%206%2010%206%20v%20-6%20l%206%209%20l%20-6%209%20v%20-6%20q%20-10%202%20-10%20-12%22%20stroke-width%3D%221%22%20stroke%3D%22%23000%22%20fill%3D%22%23000%22%20stroke-linecap%3D%22round%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E) left no-repeat}.theChampPullOut{background:url(data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%220%200%2030%2030%22%3E%0A%3Cpath%20d%3D%22M%2023%206%20q%20-2%206%20-10%206%20v%20-6%20l%20-6%209%20l%206%209%20v%20-6%20q%2010%202%2010%20-12%22%20stroke-width%3D%221%22%20stroke%3D%22%23000%22%20fill%3D%22%23000%22%20stroke-linecap%3D%22round%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E) left no-repeat}.theChampCommentingTabs li{padding-left:0!important;float:left;margin:0 1em 0 0!important;list-style:none;color:#aaa;display:block;cursor:pointer;font-size:.85em}.theChampCommentingTabs ul{float:left;padding-left:0;margin-left:0}li.theChampSelectedTab{color:#333;border-bottom:2px solid #23a9e1}.fb-comments,.fb-comments span,.fb-comments span iframe[style]{min-width:100%!important;width:100%!important}#mc-input,#user_email,#user_login{height:auto!important}div.the_champ_horizontal_counter li{margin-right:14px!important}div.theChampTotalShareCount{word-wrap:normal!important;font-weight: bolder;font-family: sans-serif;padding: 0;margin: 0;text-align:center}div.theChampTotalShareText{word-wrap:normal!important;margin: 0;padding: 0;text-align: center;}.theChampAIMBackground{background-color: #10ff00}.theChampAmazonWishListBackground{background-color: #ffe000}.theChampAOLMailBackground{background-color: #2A2A2A}.theChampAppnetBackground{background-color: #5D5D5D}.theChampBalatarinBackground{background-color: #fff}.theChampBibSonomyBackground{background-color: #000}.theChampBittyBrowserBackground{background-color: #EFEFEF}.theChampBlinklistBackground{background-color: #3D3C3B}.theChampBloggerPostBackground{background-color: #FDA352}.theChampBlogMarksBackground{background-color: #535353}.theChampBookmarksfrBackground{background-color: #E8EAD4}.theChampBoxnetBackground{background-color: #1A74B0}.theChampBuddyMarksBackground{background-color: #ffd400}.theChampCare2NewsBackground{background-color: #6EB43F}.theChampCopyLinkBackground{background-color: #FFC112}.theChampCommentBackground{background-color: #444}.theChampCiteULikeBackground{background-color: #2781CD}.theChampDiaryRuBackground{background-color: #E8D8C6}.theChampDiasporaBackground{background-color: #0166FF}.theChampDiigoBackground{background-color: #4A8BCA}.theChampDoubanBackground{background-color: #497700}.theChampDraugiemBackground{background-color: #ffad66}.theChampDZoneBackground{background-color: #fff088}.theChampEvernoteBackground{background-color: #8BE056}.theChampFacebookMessengerBackground{background-color: #0084FF}.theChampFarkBackground{background-color: #555}.theChampFintelBackground{background-color:#087515}.theChampFlipboardBackground{background-color: #CC0000}.theChampFolkdBackground{background-color: #0F70B2}.theChampGoogleClassroomBackground{background-color: #FFC112}.theChampGoogleBookmarksBackground{background-color: #CB0909}.theChampGoogleGmailBackground{background-color: #E5E5E5}.theChampHackerNewsBackground{background-color: #F60}.theChampHatenaBackground{background-color: #00A6DB}.theChampInstapaperBackground{background-color: #EDEDED}.theChampJamespotBackground{background-color: #FF9E2C}.theChampKakaoBackground{background-color: #FCB700}.theChampKindleItBackground{background-color: #2A2A2A}.theChampKikBackground{background-color: #2A2A2A}.theChampKnownBackground{background-color: #fff101}.theChampLineBackground{background-color: #00C300}.theChampMailRuBackground{background-color: #356FAC}.theChampMendeleyBackground{background-color: #A70805}.theChampMeneameBackground{background-color: #FF7D12}.theChampMixiBackground{background-color: #EDEDED}.theChampMySpaceBackground{background-color: #2A2A2A}.theChampNetvouzBackground{background-color: #c0ff00}.theChampOdnoklassnikiBackground{background-color: #F2720C}.theChampOutlookcomBackground{background-color: #0072C6}.theChampPapalyBackground{background-color: #3AC0F6}.theChampPinboardBackground{background-color: #1341DE}.theChampPlurkBackground{background-color: #CF682F}.theChampPocketBackground{background-color: #f0f0f0}.theChampPrintFriendlyBackground{background-color: #61D1D5}.theChampProtopageBookmarksBackground{background-color: #413FFF}.theChampPushaBackground{background-color: #0072B8}.theChampQzoneBackground{background-color: #2B82D9}.theChampRefindBackground{background-color: #1492ef}.theChampRediffMyPageBackground{background-color: #D20000}.theChampRenrenBackground{background-color: #005EAC}.theChampSinaWeiboBackground{background-color: #ff0}.theChampSiteJotBackground{background-color: #ffc800}.theChampSkypeBackground{background-color: #00AFF0}.theChampSMSBackground{background-color: #6ebe45}.theChampSlashdotBackground{background-color: #004242}.theChampSvejoBackground{background-color: #fa7aa3}.theChampSymbalooFeedsBackground{background-color: #6DA8F7}.theChampTelegramBackground{background-color: #3DA5f1}.theChampThreemaBackground{background-color:#2A2A2A}.theChampTrelloBackground{background-color: #1189CE}.theChampTuentiBackground{background-color: #0075C9}.theChampTwiddlaBackground{background-color: #EDEDED}.theChampTypePadPostBackground{background-color: #2A2A2A}.theChampViadeoBackground{background-color: #2A2A2A}.theChampViberBackground{background-color: #8B628F}.theChampWaneloBackground{background-color: #fff}.theChampWebnewsBackground{background-color: #CC2512}.theChampWordPressBackground{background-color: #464646}.theChampWykopBackground{background-color: #367DA9}.theChampYahooMailBackground{background-color: #400090}.theChampYoolinkBackground{background-color: #A2C538}.theChampBehanceBackground{background-color: #053eff}.theChampFlickrBackground{background-color: #ff0084}.theChampFoursquareBackground{background-color: #f94877}.theChampGithubBackground{background-color: #2a2a2a}.theChampMediumBackground{background-color: #2a2a2a}.theChampOdnoklassnikiBackground{background-color: #F2720C}.theChampSnapchatBackground{background-color: #ffe900}.theChampVimeoBackground{background-color: #1ab7ea}.theChampYoutubeBackground{background-color: #ff0000}.theChampRSSBackground{background-color: #e3702d}.theChampGentleReaderBackground{background-color:#46aecf}.theChampBehanceSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-2%20-2%2036%2036%22%3E%3Cpath%20d%3D%22M3.862%208.136h5.66c1.377%200%203.19%200%204.13.566a3.705%203.705%200%200%201%201.837%203.26c0%201.66-.88%202.905-2.32%203.494v.042c1.924.397%202.97%201.838%202.97%203.76%200%202.297-1.636%204.483-4.743%204.483H3.86V8.14zm2.078%206.71h4.152c2.36%200%203.322-.856%203.322-2.493%200-2.16-1.53-2.468-3.322-2.468H5.94v4.96zm0%207.144h5.2c1.792%200%202.93-1.09%202.93-2.797%200-2.03-1.64-2.598-3.388-2.598H5.94v5.395zm22.017-1.833C27.453%2022.65%2025.663%2024%2023.127%2024c-3.607%200-5.31-2.49-5.422-5.944%200-3.386%202.23-5.878%205.31-5.878%204%200%205.225%203.74%205.116%206.47h-8.455c-.067%201.966%201.05%203.716%203.52%203.716%201.53%200%202.6-.742%202.928-2.206h1.838zm-1.793-3.15c-.088-1.77-1.42-3.19-3.256-3.19-1.946%200-3.106%201.466-3.236%203.19h6.492zM20.614%208h4.935v1.68h-4.94z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampFlickrSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-2%20-2%2036%2036%22%3E%3Cg%20fill%3D%22%23fff%22%3E%3Ccircle%20cx%3D%2223%22%20cy%3D%2216%22%20r%3D%226%22%3E%3C%2Fcircle%3E%3Ccircle%20cx%3D%229%22%20cy%3D%2216%22%20r%3D%226%22%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E') no-repeat center center}.theChampFoursquareSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-4%20-4%2040%2040%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M21.516%203H7.586C5.66%203%205%204.358%205%205.383v21.995c0%201.097.65%201.407.958%201.53.31.126%201.105.206%201.676-.36l6.72-7.455c.105-.12.49-.284.552-.284h4.184c1.79%200%201.81-1.45%201.997-2.206.157-.63%201.946-9.57%202.58-12.395.523-2.32-.104-3.21-2.15-3.21zM20.2%209.682c-.07.33-.368.66-.75.693h-5.44c-.61-.034-1.108.422-1.108%201.032v.665c0%20.61.5%201.24%201.108%201.24h4.607c.43%200%20.794.276.7.737-.093.46-.573%202.82-.627%203.07-.052.254-.282.764-.716.764h-3.62c-.682%200-1.36-.008-1.816.56-.458.573-4.534%205.293-4.534%205.293V6.403c0-.438.31-.746.715-.74h11.274c.41-.006.915.41.834%201L20.2%209.68z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampGithubSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-2%20-2%2036%2036%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M16%203.32c-7.182%200-13%205.82-13%2013%200%205.754%203.72%2010.612%208.89%2012.335.65.114.893-.276.893-.617%200-.31-.016-1.333-.016-2.42-3.266.6-4.11-.797-4.37-1.53-.147-.373-.78-1.527-1.334-1.835-.455-.244-1.105-.845-.016-.86%201.024-.017%201.755.942%202%201.332%201.17%201.966%203.038%201.414%203.785%201.073.114-.845.455-1.414.83-1.74-2.893-.324-5.916-1.445-5.916-6.418%200-1.414.504-2.584%201.333-3.494-.13-.325-.59-1.657.13-3.445%200%200%201.085-.34%203.57%201.337%201.04-.293%202.146-.44%203.25-.44s2.21.147%203.25.44c2.49-1.69%203.58-1.337%203.58-1.337.714%201.79.26%203.12.13%203.446.828.91%201.332%202.064%201.332%203.494%200%204.99-3.04%206.094-5.93%206.42.47.405.876%201.185.876%202.404%200%201.74-.016%203.136-.016%203.575%200%20.34.244.743.894.613C25.28%2026.933%2029%2022.053%2029%2016.32c0-7.182-5.817-13-13-13z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampSnapchatSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2032%2032%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M26.177%2020.978c-2.867-.473-4.157-3.414-4.21-3.54l-.01-.02c-.153-.31-.187-.57-.1-.772.164-.39.774-.583%201.177-.71.113-.037.22-.07.306-.105.715-.28%201.073-.625%201.066-1.03-.006-.312-.252-.593-.642-.732a1.168%201.168%200%200%200-.44-.084.975.975%200%200%200-.405.083c-.34.16-.65.246-.91.258a.789.789%200%200%201-.357-.087l.027-.45.005-.062c.09-1.432.203-3.215-.266-4.264C20.03%206.34%2017.073%206.1%2016.2%206.1h-.052l-.363.003c-.87%200-3.818.243-5.208%203.36-.47%201.05-.357%202.833-.268%204.264l.03.513a.83.83%200%200%201-.41.09c-.276%200-.6-.087-.97-.26a.795.795%200%200%200-.335-.067c-.43%200-.946.282-1.026.704-.06.305.077.748%201.054%201.134.087.036.193.07.305.105.403.128%201.012.322%201.18.71.084.203.05.463-.103.773l-.01.022c-.054.125-1.344%203.068-4.21%203.54a.437.437%200%200%200-.366.455.6.6%200%200%200%20.048.196c.216.504%201.123.87%202.775%201.13.055.075.113.34.148.5.036.16.07.32.12.494.05.17.18.374.514.374.133%200%20.292-.03.475-.067.275-.053.652-.127%201.124-.127.26%200%20.532.022.805.067.532.09.985.41%201.51.78.75.53%201.6%201.132%202.894%201.132.034%200%20.07%200%20.105-.005.04.002.095.004.153.004%201.29%200%202.142-.6%202.892-1.132.526-.37.978-.69%201.51-.78.274-.045.545-.068.807-.068.45%200%20.805.056%201.123.12.2.037.36.057.476.057h.024c.246%200%20.42-.13.488-.365.05-.17.086-.327.12-.49.037-.16.094-.422.15-.496%201.65-.256%202.56-.624%202.773-1.125a.568.568%200%200%200%20.047-.196.433.433%200%200%200-.363-.458z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampTumblrSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-2%20-2%2036%2036%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M20.775%2021.962c-.37.177-1.08.33-1.61.345-1.598.043-1.907-1.122-1.92-1.968v-6.217h4.007V11.1H17.26V6.02h-2.925s-.132.044-.144.15c-.17%201.556-.895%204.287-3.923%205.378v2.578h2.02v6.522c0%202.232%201.647%205.404%205.994%205.33%201.467-.025%203.096-.64%203.456-1.17l-.96-2.846z%22%2F%3E%3C%2Fsvg%3E') no-repeat center center}.theChampVimeoSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-2%20-2%2036%2036%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M26.926%2010.627c-.103%202.25-1.675%205.332-4.716%209.245C19.066%2023.957%2016.406%2026%2014.23%2026c-1.348%200-2.49-1.244-3.42-3.732l-1.867-6.844C8.25%2012.937%207.51%2011.69%206.715%2011.69c-.173%200-.778.365-1.815%201.09l-1.088-1.4a300.012%20300.012%200%200%200%203.374-3.01c1.522-1.315%202.666-2.007%203.427-2.076%201.8-.173%202.907%201.057%203.322%203.69.45%202.84.76%204.608.935%205.3.52%202.356%201.09%203.534%201.713%203.534.483%200%201.21-.764%202.18-2.294.97-1.528%201.488-2.692%201.558-3.49.14-1.32-.38-1.98-1.553-1.98-.554%200-1.125.126-1.712.378%201.137-3.722%203.308-5.53%206.513-5.426%202.378.068%203.498%201.61%203.36%204.62z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampRSSSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-4%20-4%2040%2040%22%3E%3Cg%20fill%3D%22%23fff%22%3E%3Cellipse%20cx%3D%227.952%22%20cy%3D%2224.056%22%20rx%3D%222.952%22%20ry%3D%222.944%22%3E%3C%2Fellipse%3E%3Cpath%20d%3D%22M5.153%2016.625c2.73%200%205.295%201.064%207.22%202.996a10.2%2010.2%200%200%201%202.996%207.255h4.2c0-7.962-6.47-14.44-14.42-14.44v4.193zm.007-7.432c9.724%200%2017.636%207.932%2017.636%2017.682H27C27%2014.812%2017.203%205%205.16%205v4.193z%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E') no-repeat center center}.theChampMeWeSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-3%20-3%2038%2038%22%3E%3Cg%20fill%3D%22%23fff%22%3E%3Cpath%20d%3D%22M9.636%2010.427a1.22%201.22%200%201%201-2.44%200%201.22%201.22%200%201%201%202.44%200zM15.574%2010.431a1.22%201.22%200%200%201-2.438%200%201.22%201.22%200%201%201%202.438%200zM22.592%2010.431a1.221%201.221%200%201%201-2.443%200%201.221%201.221%200%200%201%202.443%200zM29.605%2010.431a1.221%201.221%200%201%201-2.442%200%201.221%201.221%200%200%201%202.442%200zM3.605%2013.772c0-.471.374-.859.859-.859h.18c.374%200%20.624.194.789.457l2.935%204.597%202.95-4.611c.18-.291.43-.443.774-.443h.18c.485%200%20.859.387.859.859v8.113a.843.843%200%200%201-.859.845.857.857%200%200%201-.845-.845V16.07l-2.366%203.559c-.18.276-.402.443-.72.443-.304%200-.526-.167-.706-.443l-2.354-3.53V21.9c0%20.471-.374.83-.845.83a.815.815%200%200%201-.83-.83v-8.128h-.001zM14.396%2014.055a.9.9%200%200%201-.069-.333c0-.471.402-.83.872-.83.415%200%20.735.263.845.624l2.23%206.66%202.187-6.632c.139-.402.428-.678.859-.678h.124c.428%200%20.735.278.859.678l2.187%206.632%202.23-6.675c.126-.346.415-.609.83-.609.457%200%20.845.361.845.817a.96.96%200%200%201-.083.346l-2.867%208.032c-.152.43-.471.706-.887.706h-.165c-.415%200-.721-.263-.872-.706l-2.161-6.328-2.16%206.328c-.152.443-.47.706-.887.706h-.165c-.415%200-.72-.263-.887-.706l-2.865-8.032z%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E') no-repeat center center}.theChampYoutubeSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2032%2032%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M26.78%2011.6s-.215-1.515-.875-2.183c-.837-.876-1.774-.88-2.204-.932-3.075-.222-7.693-.222-7.693-.222h-.01s-4.618%200-7.697.222c-.43.05-1.368.056-2.205.932-.66.668-.874%202.184-.874%202.184S5%2013.386%205%2015.166v1.67c0%201.78.22%203.56.22%203.56s.215%201.516.874%202.184c.837.875%201.936.85%202.426.94%201.76.17%207.48.22%207.48.22s4.623-.007%207.7-.23c.43-.05%201.37-.056%202.205-.932.66-.668.875-2.184.875-2.184s.22-1.78.22-3.56v-1.67c0-1.78-.22-3.56-.22-3.56zm-13.052%207.254v-6.18l5.944%203.1-5.944%203.08z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampTelegramSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-1%20-3%2036%2036%22%20width%3D%22100%25%22%20height%3D%22100%25%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M25.515%206.896L6.027%2014.41c-1.33.534-1.322%201.276-.243%201.606l5%201.56%201.72%205.66c.226.625.115.873.77.873.506%200%20.73-.235%201.012-.51l2.43-2.363%205.056%203.734c.93.514%201.602.25%201.834-.863l3.32-15.638c.338-1.363-.52-1.98-1.41-1.577z%22%2F%3E%3C%2Fsvg%3E') no-repeat center center}.theChampInstagramSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20id%3D%22Layer_1%22%20version%3D%221.1%22%20viewBox%3D%22-10%20-10%20148%20148%22%20xml%3Aspace%3D%22preserve%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cg%3E%3Cg%3E%3Cpath%20d%3D%22M86%2C112H42c-14.336%2C0-26-11.663-26-26V42c0-14.337%2C11.664-26%2C26-26h44c14.337%2C0%2C26%2C11.663%2C26%2C26v44%20%20%20%20C112%2C100.337%2C100.337%2C112%2C86%2C112z%20M42%2C24c-9.925%2C0-18%2C8.074-18%2C18v44c0%2C9.925%2C8.075%2C18%2C18%2C18h44c9.926%2C0%2C18-8.075%2C18-18V42%20%20%20%20c0-9.926-8.074-18-18-18H42z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3Cg%3E%3Cpath%20d%3D%22M64%2C88c-13.234%2C0-24-10.767-24-24c0-13.234%2C10.766-24%2C24-24s24%2C10.766%2C24%2C24C88%2C77.233%2C77.234%2C88%2C64%2C88z%20M64%2C48c-8.822%2C0-16%2C7.178-16%2C16s7.178%2C16%2C16%2C16c8.822%2C0%2C16-7.178%2C16-16S72.822%2C48%2C64%2C48z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3Cg%3E%3Ccircle%20cx%3D%2289.5%22%20cy%3D%2238.5%22%20fill%3D%22%23fff%22%20r%3D%225.5%22%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E') no-repeat center center}.theChampWhatsappBackground a,i.theChampLineBackground a,i.theChampViberBackground a{display:inline!important}.the_champ_sharing_container a{padding:0!important;box-shadow:none!important;border:none!important}div.course_instructor_widget .the_champ_vertical_sharing{display:none!important;}@media screen and (max-width:783px){#the_champ_sharing_more_providers{width:80%;left:60%;margin-left:-50%;text-shadow:none!important}#the_champ_sharing_more_providers .filter input.search{border:1px solid #ccc;width:92%}}@media screen and (max-width:475px){#the_champ_sharing_more_content .all-services ul li{width:100%!important;}}#ss_openid{border:1px solid gray;display:inline;font-family:"Trebuchet MS";font-size:12px;width:98%;padding:.35em .325em .75em;margin-bottom:20px}#ss_openid form{margin-top:25px;margin-left:0;padding:0;background:transparent;-webkit-box-shadow:none;box-shadow:none}#ss_openid input{font-family:"Trebuchet MS";font-size:12px;width:100px;float:left}#ss_openid input[type=submit]{background:#767676;padding:.75em 2em;border:0;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;color:#fff;cursor:pointer;display:inline-block;font-weight:800;line-height:1;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}#ss_openid legend{color:#FF6200;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:table;max-width:100%;padding:0;white-space:normal}#ss_openid input.openid_login{background-color:#fff;background-position:0 50%;color:#000;width:220px;margin-right:10px;height:30px;margin-bottom:5px;background:#fff;background-image:-webkit-linear-gradient(rgba(255,255,255,0),rgba(255,255,255,0));border:1px solid #bbb;-webkit-border-radius:3px;border-radius:3px;display:block;padding:.7em;line-height:1.5}#ss_openid a{color:silver}#ss_openid a:hover{color:#5e5e5e}.heateor_ms_subscribe_option{line-height: 14px;margin-top: 8px;}.heateor_ms_subscribe_option input.heateor_ms_checkbox, .heateor_ms_subscribe_option label.heateor_ms_checkbox_label{float:left;font-size: 15px;margin: 0;color: #666;}.heateor_ms_subscribe_option input.heateor_ms_checkbox{margin: 0 4px 0 0;width: 15px;height: 15px;float: left;}div.heateor_ss_sl_optin_container{clear:both}div.heateor_ss_sl_optin_container a{color:blue}div.heateor_ss_sl_optin_container label{font-size:11px;font-weight:normal}input.heateor_ss_social_login_optin{vertical-align:middle}
1
+ @charset "utf-8";#the_champ_error{color:red;margin:7px 0}.the_champ_login_container{margin:2px 0}.the_champ_login_container img,.the_champ_sharing_container img{cursor:pointer;margin:2px;border:none}.the_champ_login_container img{display:none;float:left}#the_champ_loading_image{display:block!important;float:none}.the_champ_error{background-color:#FFFFE0;border:1px solid #E6DB55;padding:5px;margin:10px}#the_champ_sharing_more_providers{position:fixed;top:50%;left:47%;background:#FAFAFA;width:650px;margin:-180px 0 0 -300px;z-index:10000000;text-shadow:none!important;height:308px}#the_champ_popup_bg,#heateor_ss_browser_popup_bg,#heateor_ss_lj_popup_bg{background:url(../images/transparent_bg.png);bottom:0;display:block;left:0;position:fixed;right:0;top:0;z-index:10000}#the_champ_sharing_more_providers .title{font-size:14px!important;height:auto!important;background:#58B8F8!important;border-bottom:1px solid #D7D7D7!important;color:#fff;font-weight:700;letter-spacing:inherit;line-height:34px!important;padding:0!important;text-align:center;text-transform:none;margin:0!important;text-shadow:none!important;width:100%}#the_champ_sharing_more_providers *{font-family:Arial,Helvetica,sans-serif}#the_champ_sharing_more_providers #the_champ_sharing_more_content{background:#FAFAFA;border-radius:4px;color:#555;height:auto;width:100%}#the_champ_sharing_more_providers .filter{margin:0;padding:10px 0 0;position:relative;width:100%}#the_champ_sharing_more_providers .all-services{clear:both;height:250px;overflow:auto}#the_champ_sharing_more_content .all-services ul{margin:10px!important;overflow:hidden;list-style:none;padding-left:0!important;position:static!important;width:auto!important}#the_champ_sharing_more_content .all-services ul li{margin:0;background:0 0!important;float:left;width:33.3333%!important;text-align:left!important}#the_champ_sharing_more_providers .close-button img{margin:0;}#the_champ_sharing_more_providers .close-button.separated{background:0 0!important;border:none!important;box-shadow:none!important;width:auto!important;height:auto!important;z-index:1000}#the_champ_sharing_more_providers .close-button{height:auto!important;width:auto!important;left:auto!important;display:block!important;color:#555!important;cursor:pointer!important;font-size:29px!important;line-height:29px!important;margin:0!important;padding:0!important;position:absolute;right:-13px;top:-11px}#the_champ_sharing_more_providers .filter input.search{width:94%;display:block;float:none;font-family:"open sans","helvetica neue",helvetica,arial,sans-serif;font-weight:300;height:auto;line-height:inherit;margin:0 auto;padding:5px 8px 5px 10px;border:1px solid #ccc!important;color:#000;background:#FFF!important;font-size:16px!important;text-align:left!important}#the_champ_sharing_more_providers .footer-panel{background:#fff;border-top:1px solid #D7D7D7;padding:6px 0;width:100%;color:#fff}#the_champ_sharing_more_providers .footer-panel p{background-color:transparent;top:0;text-align:left!important;color:#000;font-family:'helvetica neue',arial,helvetica,sans-serif;font-size:12px;line-height:1.2;margin:0!important;padding:0 6px!important;text-indent:0!important}#the_champ_sharing_more_providers .footer-panel a{color:#fff;text-decoration:none;font-weight:700;text-indent:0!important}#the_champ_sharing_more_providers .all-services ul li a{border-radius:3px;color:#666!important;display:block;font-size:18px;height:auto;line-height:28px;overflow:hidden;padding:8px;text-decoration:none!important;text-overflow:ellipsis;white-space:nowrap;border:none!important;text-indent:0!important;background:0 0!important;text-shadow:none;box-shadow:none!important}.the_champ_share_count{display:block;text-indent:0!important;visibility:hidden;background-color:#58B8F8!important;width:5px;height:auto;text-align:center;min-width:8px!important;padding:1px 4px!important;color:#fff!important;font-family:'Open Sans',arial,sans-serif!important;font-size:10px!important;font-weight:600!important;-webkit-border-radius:15px!important;border-radius:15px!important;-webkit-box-shadow:0 2px 2px rgba(0,0,0,.4);box-shadow:0 2px 2px rgba(0,0,0,.4);text-shadow:0 -1px 0 rgba(0,0,0,.2);line-height:14px!important;border:2px solid #fff!important;z-index:1;margin:2px auto!important;box-sizing:content-box!important}.the_champ_share_count,.the_champ_vertical_counter,.the_champ_vertical_sharing{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important}ul.the_champ_login_ul,ul.the_champ_sharing_ul,ul.heateor_ss_follow_ul{list-style:none!important;padding-left:0!important}#the_champ_comment_toggle{margin-bottom:10px}ul.the_champ_login_ul{margin:3px 0!important}ul.the_champ_login_ul li{background:none;float:left;padding:0!important;margin:0!important;border:0!important;width:auto!important;clear:none!important;list-style-type:none!important}.theChampLoginSvg{-webkit-box-sizing:content-box;-moz-box-sizing:border-box;box-sizing:content-box;width:100%;height:100%;background-position:center!important}.theChampXingLoginSvg{background-size:109%!important;background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAzMCAzMCI+DQo8cGF0aCBkPSJNIDYgOSBoIDUgbCA0IDQgbCAtNSA3IGggLTUgbCA1IC03IHogbSAxNSAtNCBoIDUgbCAtOSAxMyBsIDQgOCBoIC01IGwgLTQgLTggeiIgZmlsbD0iI2ZmZiI+PC9wYXRoPg0KPC9zdmc+) left no-repeat}.theChampGoogleLoginSvg{background-size:111%!important;background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20viewBox%3D%22-8%20-8%2064%2064%22%3E%3Cdefs%3E%3Cpath%20id%3D%22a%22%20d%3D%22M44.5%2020H24v8.5h11.8C34.7%2033.9%2030.1%2037%2024%2037c-7.2%200-13-5.8-13-13s5.8-13%2013-13c3.1%200%205.9%201.1%208.1%202.9l6.4-6.4C34.6%204.1%2029.6%202%2024%202%2011.8%202%202%2011.8%202%2024s9.8%2022%2022%2022c11%200%2021-8%2021-22%200-1.3-.2-2.7-.5-4z%22%2F%3E%3C%2Fdefs%3E%3CclipPath%20id%3D%22b%22%3E%3Cuse%20xlink%3Ahref%3D%22%23a%22%20overflow%3D%22visible%22%2F%3E%3C%2FclipPath%3E%3Cpath%20clip-path%3D%22url(%23b)%22%20fill%3D%22%23FBBC05%22%20d%3D%22M0%2037V11l17%2013z%22%2F%3E%3Cpath%20clip-path%3D%22url(%23b)%22%20fill%3D%22%23EA4335%22%20d%3D%22M0%2011l17%2013%207-6.1L48%2014V0H0z%22%2F%3E%3Cpath%20clip-path%3D%22url(%23b)%22%20fill%3D%22%2334A853%22%20d%3D%22M0%2037l30-23%207.9%201L48%200v48H0z%22%2F%3E%3Cpath%20clip-path%3D%22url(%23b)%22%20fill%3D%22%234285F4%22%20d%3D%22M48%2048L17%2024l-4-3%2035-10z%22%2F%3E%3C%2Fsvg%3E') left no-repeat}.theChampLinkedinLoginSvg{background-size:121%!important;background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-1%200%2033%2035%22%3E%3Cpath%20d%3D%22M6.227%2012.61h4.19v13.48h-4.19V12.61zm2.095-6.7a2.43%202.43%200%200%201%200%204.86c-1.344%200-2.428-1.09-2.428-2.43s1.084-2.43%202.428-2.43m4.72%206.7h4.02v1.84h.058c.56-1.058%201.927-2.176%203.965-2.176%204.238%200%205.02%202.792%205.02%206.42v7.395h-4.183v-6.56c0-1.564-.03-3.574-2.178-3.574-2.18%200-2.514%201.7-2.514%203.46v6.668h-4.187V12.61z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E') left no-repeat}.theChampTwitterLoginSvg{background-size:120%!important;background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-2%20-2%2035%2035%22%3E%0A%3Cpath%20d%3D%22M28%208.557a9.913%209.913%200%200%201-2.828.775%204.93%204.93%200%200%200%202.166-2.725%209.738%209.738%200%200%201-3.13%201.194%204.92%204.92%200%200%200-3.593-1.55%204.924%204.924%200%200%200-4.794%206.049c-4.09-.21-7.72-2.17-10.15-5.15a4.942%204.942%200%200%200-.665%202.477c0%201.71.87%203.214%202.19%204.1a4.968%204.968%200%200%201-2.23-.616v.06c0%202.39%201.7%204.38%203.952%204.83-.414.115-.85.174-1.297.174-.318%200-.626-.03-.928-.086a4.935%204.935%200%200%200%204.6%203.42%209.893%209.893%200%200%201-6.114%202.107c-.398%200-.79-.023-1.175-.068a13.953%2013.953%200%200%200%207.55%202.213c9.056%200%2014.01-7.507%2014.01-14.013%200-.213-.005-.426-.015-.637.96-.695%201.795-1.56%202.455-2.55z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%0A%3C%2Fsvg%3E') left no-repeat}.theChampVkontakteLoginSvg{background-size:114%!important;background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%221%202%2030%2028%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23fff%22%20d%3D%22M15.764%2022.223h1.315s.394-.044.6-.262c.184-.2.18-.574.18-.574s-.03-1.764.79-2.023c.81-.255%201.844%201.705%202.942%202.46.832.57%201.464.445%201.464.445l2.936-.04s1.538-.097.81-1.304c-.06-.1-.426-.894-2.186-2.526-1.843-1.71-1.594-1.434.624-4.39%201.353-1.804%201.893-2.902%201.724-3.374-.16-.45-1.153-.33-1.153-.33l-3.306.02s-.247-.034-.428.074c-.178.108-.293.356-.293.356s-.522%201.394-1.223%202.58c-1.47%202.5-2.06%202.633-2.3%202.476-.563-.36-.42-1.454-.42-2.23%200-2.423.365-3.435-.72-3.696-.357-.085-.623-.143-1.544-.15-1.182-.014-2.18.003-2.743.28-.378.185-.667.595-.49.62.218.027.713.13.975.49.34.46.33%201.496.33%201.496s.193%202.852-.46%203.206c-.442.245-1.056-.252-2.37-2.52-.67-1.163-1.18-2.446-1.18-2.446s-.1-.24-.273-.37c-.212-.155-.506-.204-.506-.204l-3.145.02s-.473.015-.647.22c-.154.183-.01.56-.01.56s2.46%205.757%205.245%208.657c2.553%202.66%205.454%202.485%205.454%202.485z%22%2F%3E%3C%2Fsvg%3E') left no-repeat}.theChampFacebookLoginSvg{background-size:116%!important;padding-left:8px;padding-top:5px;background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-3%20-3%2038%2038%22%3E%3Cpath%20d%3D%22M17.78%2027.5V17.008h3.522l.527-4.09h-4.05v-2.61c0-1.182.33-1.99%202.023-1.99h2.166V4.66c-.375-.05-1.66-.16-3.155-.16-3.123%200-5.26%201.905-5.26%205.405v3.016h-3.53v4.09h3.53V27.5h4.223z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') left no-repeat}.theChampLiveJournalLoginSvg{background-size:111%!important;background:url(data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2032%2032%22%3E%3Cg%20fill%3D%22%2300B0EA%22%3E%3Cpath%20d%3D%22M16.76%205.53c-1.586%200-3.094.33-4.462.922l-2.47-2.465h-.005A11.268%2011.268%200%200%200%204%209.843l2.472%202.47a11.283%2011.283%200%200%201%205.823-5.86h.004l9.14%209.128h-.006a11.304%2011.304%200%200%200-5.823%205.86l-9.14-9.13c-.597%201.372-.952%202.865-.952%204.457%200%206.21%205.03%2011.24%2011.24%2011.24S28%2022.98%2028%2016.77c0-6.206-5.033-11.24-11.24-11.24zm1.95%2016.573a6.561%206.561%200%200%201%203.38-3.403l.887%204.285-4.268-.882z%22%2F%3E%3Cpath%20d%3D%22M22.092%2018.702l-.653-3.118h-.007a11.288%2011.288%200%200%200-5.822%205.858l3.097.66a6.58%206.58%200%200%201%203.38-3.4%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E) left no-repeat}.theChampSteamLoginSvg{background:url(data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20300%20300%22%3E%3Ccircle%20cx%3D%2245%22%20cy%3D%22130%22%20r%3D%2225%22%20stroke%3D%22%23fff%22%20stroke-width%3D%227%22%20fill%3D%22none%22%3E%3C%2Fcircle%3E%3Ccircle%20cx%3D%22155%22%20cy%3D%22198%22%20r%3D%2225%22%20stroke%3D%22%23fff%22%20stroke-width%3D%227%22%20fill%3D%22none%22%3E%3C%2Fcircle%3E%3Ccircle%20cx%3D%22245%22%20cy%3D%22110%22%20r%3D%2235%22%20stroke%3D%22%23fff%22%20stroke-width%3D%2210%22%20fill%3D%22none%22%3E%3C%2Fcircle%3E%3Ccircle%20cx%3D%22245%22%20cy%3D%22110%22%20r%3D%2215%22%20stroke%3D%22%23fff%22%20stroke-width%3D%2210%22%20fill%3D%22%23fff%22%3E%3C%2Fcircle%3E%3Cpath%20d%3D%22M%20160%20170%20l%2045%20-64%20l%2040%2044%20l%20-62%2044%22%20stroke%3D%22%23fff%22%20stroke-width%3D%221%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3Cpath%20d%3D%22M%2045%20130%20l%20110%2068%22%20stroke%3D%22%23fff%22%20stroke-width%3D%2230%22%20fill%3D%22%23fff%22%20stroke-linecap%3D%22round%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E) left no-repeat}.theChampInstagramLoginSvg{background-size:105%!important;background:url(data:image/svg+xml;charset=utf8,%3Csvg%20enable-background%3D%22new%200%200%20128%20128%22%20id%3D%22Layer_1%22%20version%3D%221.1%22%20viewBox%3D%220%200%20128%20128%22%20xml%3Aspace%3D%22preserve%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cg%3E%3Cg%3E%3Cpath%20d%3D%22M86%2C112H42c-14.336%2C0-26-11.663-26-26V42c0-14.337%2C11.664-26%2C26-26h44c14.337%2C0%2C26%2C11.663%2C26%2C26v44%20%20%20%20C112%2C100.337%2C100.337%2C112%2C86%2C112z%20M42%2C24c-9.925%2C0-18%2C8.074-18%2C18v44c0%2C9.925%2C8.075%2C18%2C18%2C18h44c9.926%2C0%2C18-8.075%2C18-18V42%20%20%20%20c0-9.926-8.074-18-18-18H42z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3Cg%3E%3Cpath%20d%3D%22M64%2C88c-13.234%2C0-24-10.767-24-24c0-13.234%2C10.766-24%2C24-24s24%2C10.766%2C24%2C24C88%2C77.233%2C77.234%2C88%2C64%2C88z%20M64%2C48c-8.822%2C0-16%2C7.178-16%2C16s7.178%2C16%2C16%2C16c8.822%2C0%2C16-7.178%2C16-16S72.822%2C48%2C64%2C48z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3Cg%3E%3Ccircle%20cx%3D%2289.5%22%20cy%3D%2238.5%22%20fill%3D%22%23fff%22%20r%3D%225.5%22%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E) left no-repeat}.theChampLoginButton{background:url(../images/login/login.png) no-repeat}.theChampLogin{padding:0!important;margin:2px;height:35px;width:35px;float:left;cursor:pointer;border:none}.theChampInstagramLogin,.theChampTwitterLogin,.theChampXingLogin{display:block}.theChampXingButton{background-position:-64px 0;width:32px;height:32px;display:block}.theChampFacebookButton{background-position:0 0;width:32px;height:32px;display:none}.theChampLiveButton{background-position:-32px -96px;width:32px;height:32px;display:block}.theChampGoogleButton{background-position:-32px 0;width:32px;height:32px;display:none}.theChampInstagramButton{background-position:0 -32px;width:32px;height:32px;display:block!important}.theChampLinkedinButton{background-position:-32px -32px;width:32px;height:32px;display:none}.theChampTwitterButton{background-position:0 -64px;width:32px;height:32px;display:block!important}.theChampVkontakteButton{background-position:-32px -64px;width:32px;height:32px;display:none}ul.the_champ_sharing_ul,ul.heateor_ss_follow_ul{margin:1px 0!important}#heateor_ss_lj_popup_close img,#the_champ_sharing_popup_close img{opacity: 1!important;background:0 0!important;border:none!important;outline:0!important;box-shadow:none!important;width:auto!important;height:auto!important;top:inherit!important;right:inherit!important;left:9px!important;padding:0!important}ul.the_champ_sharing_ul li.theChampSharingRound,ul.heateor_ss_follow_ul li.theChampSharingRound{background:0 0!important}.the_champ_square_count{display:none;text-align:center;font-weight:bolder;font-family:sans-serif;font-style: normal;font-size: .8em;visibility:hidden;word-wrap:normal!important}ul.heateor_ss_follow_ul li{width:auto;}ul.heateor_ss_follow_ul li,ul.the_champ_sharing_ul li{float:left!important;margin:0!important;padding:0!important;list-style:none!important;border:none!important;clear:none;}.theChampSharing{display:block;cursor:pointer;margin:2px}ul.the_champ_login_ul li:before,ul.the_champ_sharing_ul li:before,ul.heateor_ss_follow_ul li:before{content:none!important}.theChampSharingDeliciousButton{background-position:0 0;width:32px;height:32px}.theChampSharingDiggButton{background-position:-32px 0;width:32px;height:32px}.theChampSharingEmailButton{background-position:-64px 0;width:32px;height:32px}.theChampSharingXingButton{background-position:0 -128px;width:32px;height:32px}.theChampSharingWhatsappButton{background-position:-32px -128px;width:32px;height:32px}.theChampSharingYummlyButton{background-position:-64px -128px;width:32px;height:32px}.theChampSharingBufferButton{background-position:-96px -128px;width:32px;height:32px}.theChampSharingTotalsharesButton{background-position: -200px -200px}.theChampSharingFacebookButton{background-position:-96px 0;width:32px;height:32px}.theChampSharingFloatitButton{background-position:0 -32px;width:32px;height:32px}.theChampSharingGoogleButton{background-position:-32px -32px;width:32px;height:32px}.theChampSharingLinkedinButton{background-position:-64px -32px;width:32px;height:32px}.theChampSharingMoreButton{background-position:-96px -32px;width:32px;height:32px}.theChampSharingPinterestButton{background-position:0 -64px;width:32px;height:32px}.theChampSharingPrintButton{background-position:-32px -64px;width:32px;height:32px}.theChampSharingRedditButton{background-position:-64px -64px;width:32px;height:32px}.theChampSharingStumbleuponButton{background-position:-96px -64px;width:32px;height:32px}.theChampSharingTumblrButton{background-position:0 -96px;width:32px;height:32px}.theChampSharingTwitterButton{background-position:-32px -96px;width:32px;height:32px}.theChampSharingVkontakteButton{background-position:-64px -96px;width:32px;height:32px}.theChampSharingYahooButton{background-position:-96px -96px;width:32px;height:32px}.the_champ_vertical_counter,.the_champ_vertical_sharing{background:0 0;-webkit-box-shadow:0 1px 4px 1px rgba(0,0,0,.1);box-shadow:0 1px 4px 1px rgba(0,0,0,.1);position:fixed;overflow:visible;z-index:10000000;display:block;padding:10px;border-radius:4px;opacity:1;box-sizing:content-box!important}.the_champ_vertical_counter li{clear:both}li.the_champ_facebook_share .fb-share-button span,li.the_champ_facebook_like .fb-like span,li.the_champ_facebook_recommend .fb-like span{vertical-align:top!important}li.the_champ_facebook_like .fb-like span iframe,li.the_champ_facebook_recommend .fb-like span iframe{max-width:none!important;z-index:1000}div.the_champ_horizontal_sharing li{width:auto}div.the_champ_horizontal_sharing li.the_champ_facebook_share, div.the_champ_horizontal_counter li.the_champ_facebook_share{width:76px}div.the_champ_horizontal_sharing li.the_champ_facebook_like, div.the_champ_horizontal_counter li.the_champ_facebook_like{width:56px}div.the_champ_horizontal_sharing li.the_champ_facebook_recommend, div.the_champ_horizontal_counter li.the_champ_facebook_recommend{width:111px}div.the_champ_horizontal_sharing li.the_champ_twitter_tweet, div.the_champ_horizontal_counter li.the_champ_twitter_tweet{width:65px}div.the_champ_horizontal_counter li.the_champ_linkedin_share span, div.the_champ_horizontal_sharing li.the_champ_linkedin_share span{vertical-align:text-top!important}div.the_champ_horizontal_sharing li.the_champ_buffer_share{width:89px}div.the_champ_horizontal_sharing li.the_champ_linkedin_share, div.the_champ_horizontal_counter li.the_champ_linkedin_share{width:67px}div.the_champ_horizontal_sharing li.the_champ_buffer, div.the_champ_horizontal_counter li.the_champ_buffer{width:81px;}div.the_champ_horizontal_sharing li.the_champ_reddit, div.the_champ_horizontal_counter li.the_champ_reddit{width:124px}div.the_champ_horizontal_sharing li.the_champ_yummly, div.the_champ_horizontal_counter li.the_champ_yummly{width:61px}div.the_champ_horizontal_sharing li.the_champ_pinterest_pin, div.the_champ_horizontal_counter li.the_champ_pinterest_pin{width:58px}div.the_champ_horizontal_counter li.the_champ_pinterest_pin{line-height:1px}div.the_champ_horizontal_sharing li.the_champ_xing, div.the_champ_horizontal_counter li.the_champ_xing{width:67px}.the_champ_counter_container li{height:21px}input#user_login,input#user_pass{height:auto!important}.theChampHorizontalSharingButton,.theChampVerticalSharingButton{display:block}.theChampInstagramBackground{background: radial-gradient(circle at 30% 107%, #fdf497 0%, #fdf497 5%, #fd5949 45%,#d6249f 60%,#285AEB 90%)}.theChampYummlyBackground{background-color:#E16120}.theChampBufferBackground{background-color:#000}.theChampFacebookBackground{background-color:#4267B2}.theChampSteamBackground{background-color:#393939}.theChampLiveJournalBackground{background-color:#EDEDED}.theChampDiggBackground{background-color:#006094}.theChampEmailBackground{background-color:#649A3F}.theChampFloatitBackground{background-color:#53BEEE}.theChampGoogleBackground{background-color:white;box-sizing:border-box;border:1px #4184F3 solid}.theChampLinkedinBackground{background-color:#0077B5}.theChampMoreBackground{background-color:#EE8E2D}.theChampPinterestBackground{background-color:#CC2329}.theChampPrintBackground{background-color:#FD6500}.theChampRedditBackground{background-color:#FF5700}.theChampStockTwitsBackground{background-color: #40576F}.theChampTumblrBackground{background-color:#29435D}.theChampTwitterBackground{background-color:#55acee}.theChampVkontakteBackground{background-color:#5E84AC}.theChampXingBackground{background-color:#00797D}.theChampWhatsappBackground{background-color:#55EB4C}.theChampMeWeBackground{background-color:#007da1}.theChampMixBackground{background-color:#ff8226}.theChampTCBackground,.theChampTCBackground:hover{border-width: 0!important;background-color:transparent;}.theChampTCBackground{background-color:transparent!important;font-style:normal!important;word-wrap:normal;color:#666;line-height:1;visibility:hidden;}.theChampSharingTotalsharesButton{font-style:normal!important;word-wrap:normal;color:#666;line-height:1}.theChampSharingSvg{width:100%;height:100%}.theChampYummlySvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%220%200%2030%2030%22%3E%3Cpath%20stroke%3D%22%23fff%22%20d%3D%22M%2010.5%2010%20q%204%20-2%202.5%201%20l%20-1%204%20q%200%202%205%200%20l%201%20-6.5%20m%20-1%206.5%20l%20-1%204%20c%20-3%206%20-6%20-1%200%20-1%20q%201%20-1%205%201%22%20stroke-width%3D%222%22%20fill%3D%22none%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampBufferSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-4%20-4%2038%2039%22%3E%3Cpath%20stroke%3D%22%23fff%22%20d%3D%22M%2015%206%20l%20-10%205%20l%2010%205%20l%2010%20-5%20z%22%20stroke-width%3D%220%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3Cpath%20stroke%3D%22%23fff%22%20d%3D%22M%205.5%2014.5%20l%209.5%205%20l%209.5%20-5%20m%20-19%204%20l%209.5%205%20l%209.5%20-5%22%20stroke-width%3D%222%22%20fill%3D%22none%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampFacebookSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-5%20-5%2042%2042%22%3E%3Cpath%20d%3D%22M17.78%2027.5V17.008h3.522l.527-4.09h-4.05v-2.61c0-1.182.33-1.99%202.023-1.99h2.166V4.66c-.375-.05-1.66-.16-3.155-.16-3.123%200-5.26%201.905-5.26%205.405v3.016h-3.53v4.09h3.53V27.5h4.223z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampDiggSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-5%20-5%2049%2049%22%3E%3Cpath%20d%3D%22M%206%2020%20h%2010%20c%200%20-14%20-9%20-14%20-9%200%20m%205%200%20v%207%20m%20-1%200%20v%20-7%20m%204%20-7%20h%204.5%20v%20-5%20h%208%20v%208%20h%20-8%20v%20-3%20m%208%200%20h%204%20v%205.5%20h%20-3%20v%2012%20h%20-4%20v%20-8%20m%200%208%20h%20-6.5%20v%20-12%20h%20-2%22%20stroke-width%3D%222%22%20stroke%3D%22%23fff%22%20fill%3D%22none%22%3E%3C%2Fpath%3E%3Cellipse%20cx%3D%2211.5%22%20cy%3D%2228.5%22%20rx%3D%224%22%20ry%3D%222%22%20style%3D%22fill%3A%23fff%3B%22%3E%3C%2Fellipse%3E%3C%2Fsvg%3E') no-repeat center center}.theChampEmailSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-4%20-4%2043%2043%22%3E%3Cpath%20d%3D%22M%205.5%2011%20h%2023%20v%201%20l%20-11%206%20l%20-11%20-6%20v%20-1%20m%200%202%20l%2011%206%20l%2011%20-6%20v%2011%20h%20-22%20v%20-11%22%20stroke-width%3D%221%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampFloatitSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-3%20-3%2038%2038%22%3E%3Cg%20fill%3D%22%23fff%22%3E%3Cpath%20d%3D%22M16%203C8.814%203%203%208.814%203%2016s5.814%2013%2013%2013%2013-5.814%2013-13S23.187%203%2016%203zm0%2025.152c-6.712%200-12.153-5.44-12.153-12.152C3.847%209.288%209.287%203.848%2016%203.848S28.152%209.288%2028.152%2016c0%206.712-5.44%2012.152-12.152%2012.152z%22%2F%3E%3Cpath%20d%3D%22M22.406%2016A6.402%206.402%200%200%200%2016%209.593%206.402%206.402%200%200%200%209.593%2016%206.4%206.4%200%200%200%2016%2022.406%206.4%206.4%200%200%200%2022.406%2016zM16%2021.39A5.392%205.392%200%200%201%2010.61%2016%205.403%205.403%200%200%201%2016%2010.61%205.393%205.393%200%200%201%2021.39%2016%205.382%205.382%200%200%201%2016%2021.39z%22%2F%3E%3Cpath%20d%3D%22M13.763%209.187V4.864c-4.475.9-8%204.424-8.898%208.898h4.322a7.226%207.226%200%200%201%204.576-4.575zm9.05%204.576h4.32c-.896-4.475-4.422-8-8.896-8.898v4.322a7.224%207.224%200%200%201%204.575%204.576zm-4.576%209.052v4.322c4.475-.9%208-4.424%208.897-8.9h-4.322a7.232%207.232%200%200%201-4.575%204.578zm-9.05-4.578H4.863c.898%204.475%204.424%208%208.898%208.9v-4.323a7.233%207.233%200%200%201-4.574-4.577z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E') no-repeat center center}.theChampGoogleSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBkPSJNIDUxLjIyODc3NjYwNTc1NzA3IDM4LjE5MDgwNzcwMjE5NzA1IEEgMTcgMTcgMCAxIDAgNTYgNTAuMDAwMDAwMDAwMDAwMDEgaCAtMTciIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSI4IiBmaWxsPSJub25lIj48L3BhdGg+PHBhdGggZD0iTSA2NSA0OSBoIDE4IG0gLTkgLTkgdiAxOCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjUiIGZpbGw9Im5vbmUiPjwvcGF0aD48L3N2Zz4=) left no-repeat}.theChampLinkedinSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-2%20-2%2035%2039%22%3E%3Cpath%20d%3D%22M6.227%2012.61h4.19v13.48h-4.19V12.61zm2.095-6.7a2.43%202.43%200%200%201%200%204.86c-1.344%200-2.428-1.09-2.428-2.43s1.084-2.43%202.428-2.43m4.72%206.7h4.02v1.84h.058c.56-1.058%201.927-2.176%203.965-2.176%204.238%200%205.02%202.792%205.02%206.42v7.395h-4.183v-6.56c0-1.564-.03-3.574-2.178-3.574-2.18%200-2.514%201.7-2.514%203.46v6.668h-4.187V12.61z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fsvg%3E') no-repeat center center}.theChampMediumSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20focusable%3D%22false%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-2%20-2%2036%2036%22%3E%3Cpath%20d%3D%22M7.8%2011a.8.8%200%200%200-.27-.7l-2-2.42v-.41h6.23L16.57%2018l4.24-10.53h5.94v.36L25%209.47a.5.5%200%200%200-.19.48v12.1a.5.5%200%200%200%20.19.48l1.68%201.64v.36h-8.4v-.36L20%2022.49c.18-.17.18-.22.18-.49v-9.77l-4.82%2012.26h-.65L9.09%2012.23v8.22a1.09%201.09%200%200%200%20.31.94l2.25%202.74v.36h-6.4v-.36l2.26-2.74a1.09%201.09%200%200%200%20.29-.94z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampOdnoklassnikiSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-4%20-4%2040%2040%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M16%2016.16c-3.635%200-6.58-2.945-6.58-6.58C9.42%205.945%2012.364%203%2016%203s6.582%202.945%206.582%206.58c0%203.635-2.946%206.58-6.58%206.58zm0-9.817c-1.788%200-3.236%201.448-3.236%203.237%200%201.79%201.448%203.236%203.237%203.236%201.79%200%203.24-1.447%203.24-3.236%200-1.79-1.45-3.237-3.238-3.237zm7.586%2010.62c.648%201.3-.084%201.93-1.735%202.99-1.397.9-3.315%201.238-4.566%201.368l1.048%201.05%203.877%203.877c.59.59.59%201.544%200%202.134l-.178.18c-.59.59-1.544.59-2.134%200l-3.878-3.88-3.878%203.88c-.59.59-1.543.59-2.135%200l-.176-.18c-.59-.59-.59-1.543%200-2.132l3.878-3.878%201.043-1.046c-1.25-.127-3.19-.465-4.6-1.37-1.65-1.062-2.38-1.69-1.733-2.99.37-.747%201.4-1.367%202.768-.29C13.035%2018.13%2016%2018.13%2016%2018.13s2.968%200%204.818-1.456c1.37-1.077%202.4-.457%202.768.29z%22%2F%3E%3C%2Fsvg%3E') no-repeat center center}.theChampMoreSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii00IC00IDM4IDM4Ij48Y2lyY2xlIGN4PSIxMCIgY3k9IjE1IiByPSIzIiBmaWxsPSJ3aGl0ZSI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iMjAiIGN5PSIxMCIgcj0iMyIgZmlsbD0id2hpdGUiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjIwIiBjeT0iMjAiIHI9IjMiIGZpbGw9IndoaXRlIj48L2NpcmNsZT48cGF0aCBkPSJNIDEwIDE1IEwgMjAgMTAgbSAwIDEwIEwgMTAgMTUiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSIjZmZmIj48L3BhdGg+PC9zdmc+) left no-repeat}.theChampPinterestSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-2%20-2%2035%2035%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M16.539%204.5c-6.277%200-9.442%204.5-9.442%208.253%200%202.272.86%204.293%202.705%205.046.303.125.574.005.662-.33.061-.231.205-.816.27-1.06.088-.331.053-.447-.191-.736-.532-.627-.873-1.439-.873-2.591%200-3.338%202.498-6.327%206.505-6.327%203.548%200%205.497%202.168%205.497%205.062%200%203.81-1.686%207.025-4.188%207.025-1.382%200-2.416-1.142-2.085-2.545.397-1.674%201.166-3.48%201.166-4.689%200-1.081-.581-1.983-1.782-1.983-1.413%200-2.548%201.462-2.548%203.419%200%201.247.421%202.091.421%202.091l-1.699%207.199c-.505%202.137-.076%204.755-.039%205.019.021.158.223.196.314.077.13-.17%201.813-2.247%202.384-4.324.162-.587.929-3.631.929-3.631.46.876%201.801%201.646%203.227%201.646%204.247%200%207.128-3.871%207.128-9.053.003-3.918-3.317-7.568-8.361-7.568z%22%2F%3E%3C%2Fsvg%3E') no-repeat center center}.theChampPrintSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii00IC02IDM4IDM4Ij48cGF0aCBzdHJva2U9IiNmZmYiIGQ9Ik0gNyAxMCBoIDIgdiAzIGggMTIgdiAtMyBoIDIgdiA3IGggLTIgdiAtMyBoIC0xMiB2IDMgaCAtMiB6IiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9IiNmZmYiPjwvcGF0aD48cmVjdCBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS44IiBoZWlnaHQ9IjciIHdpZHRoPSIxMCIgeD0iMTAiIHk9IjUiIGZpbGw9Im5vbmUiPjwvcmVjdD48cmVjdCBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMSIgaGVpZ2h0PSI1IiB3aWR0aD0iOCIgeD0iMTEiIHk9IjE2IiBmaWxsPSIjZmZmIj48L3JlY3Q+PC9zdmc+) left no-repeat}.theChampRedditSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii02IC02IDQyIDQyIj48ZWxsaXBzZSBjeD0iMTUiIGN5PSIxOSIgcng9IjkiIHJ5PSI3IiBzdHlsZT0ic3Ryb2tlOndoaXRlO3N0cm9rZS13aWR0aDoyIiBmaWxsPSJub25lIj48L2VsbGlwc2U+PGNpcmNsZSBjeD0iMTEiIGN5PSIxNyIgcj0iMiIgZmlsbD0id2hpdGUiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjE5IiBjeT0iMTciIHI9IjIiIGZpbGw9IndoaXRlIj48L2NpcmNsZT48Y2lyY2xlIGN4PSIyMiIgY3k9IjciIHI9IjIiIGZpbGw9IndoaXRlIj48L2NpcmNsZT48Y2lyY2xlIGN4PSI3IiBjeT0iMTQiIHI9IjIiIGZpbGw9IndoaXRlIj48L2NpcmNsZT48Y2lyY2xlIGN4PSIyMyIgY3k9IjE0IiByPSIyIiBmaWxsPSJ3aGl0ZSI+PC9jaXJjbGU+PHBhdGggZD0iTSAxMCAyMiBxIDUgMyAxMCAwIE0gMTUgMTIgbCAxIC02IGwgNiAxIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZT0iI2ZmZiIgZmlsbD0ibm9uZSI+PC9wYXRoPjwvc3ZnPg==) left no-repeat}.theChampTumblrSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii00IC00IDM4IDM4Ij48cGF0aCBkPSJNIDE0IDcgdiAxNCBxIDMgMiA2IDAgTSAxNCA3LjUgcSAwIDUuNSAtNCA1LjUgaCA5IiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZT0iI2ZmZiIgZmlsbD0ibm9uZSI+PC9wYXRoPjwvc3ZnPg==) left no-repeat}.theChampTwitterSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii04IC04IDY0IDY0Ij4NCjxwYXRoIGQ9Ik0gMzggMTkgcSAyIC0xIDQgLTUgcSAtMS41IDIgLTQgMiBxIDEuNSAtMSAzLjUgLTUgcSAtMS41IDIgLTUgMiBjIC01IC01IC0xMyAtMiAtMTIgNiBxIC03IDEgLTE1IC04IHEgLTIgNCAxIDkgcSAtMSAwIC0zIC0xIHEgMCA1IDUgNyBxIC0xIC41IC0zIDAgcSAxIDQgOCA2IHEgLTUgMyAtMTEgMyBjIDE0IDggMzAgMCAzMS41IC0xNCIgc3Ryb2tlLXdpZHRoPSIwLjMiIGZpbGw9IiNmZmYiPjwvcGF0aD4NCjwvc3ZnPg==) left no-repeat}.theChampVkontakteSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii01IC01IDQwIDQwIj4NCjxwYXRoIGQ9Ik0gMi41IDkgaCA0LjUgbCA1IDcgdiAtNyBoIDQuNSB2IDcgbCA1IC03IGggNSBsIC01IDcgbCA1IDcgaCAtNSBsIC01IC03IHYgNyBoIC00LjUgcSAtMiAwIC01IC02IHoiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0iI2ZmZiI+PC9wYXRoPg0KPC9zdmc+) left no-repeat}.theChampXingSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii02IC02IDQyIDQyIj4NCjxwYXRoIGQ9Ik0gNiA5IGggNSBsIDQgNCBsIC01IDcgaCAtNSBsIDUgLTcgeiBtIDE1IC00IGggNSBsIC05IDEzIGwgNCA4IGggLTUgbCAtNCAtOCB6IiBmaWxsPSIjZmZmIj48L3BhdGg+DQo8L3N2Zz4=) left no-repeat}.theChampWhatsappSvg{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9Ii01IC01IDQwIDQwIj48cGF0aCBpZD0iYXJjMSIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiIGQ9Ik0gMTEuNTc5Nzk4NTY2NzQzMzE0IDI0LjM5NjkyNjIwNzg1OTA4NSBBIDEwIDEwIDAgMSAwIDYuODA4NDc5NTU3MTEwMDc5IDIwLjczNTc2NDM2MzUxMDQ2Ij48L3BhdGg+PHBhdGggZD0iTSA3IDE5IGwgLTEgNiBsIDYgLTEiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIj48L3BhdGg+PHBhdGggZD0iTSAxMCAxMCBxIC0xIDggOCAxMSBjIDUgLTEgMCAtNiAtMSAtMyBxIC00IC0zIC01IC01IGMgNCAtMiAtMSAtNSAtMSAtNCIgZmlsbD0iI2ZmZiI+PC9wYXRoPjwvc3ZnPg==) left no-repeat}.theChampSharing{float:left;border:none}.theChampSharingArrow{height:16px;width:16px;cursor:pointer;margin-top:10px}.theChampPushIn{background:url(data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%220%200%2030%2030%22%3E%0A%3Cpath%20d%3D%22M%207%206%20q%202%206%2010%206%20v%20-6%20l%206%209%20l%20-6%209%20v%20-6%20q%20-10%202%20-10%20-12%22%20stroke-width%3D%221%22%20stroke%3D%22%23000%22%20fill%3D%22%23000%22%20stroke-linecap%3D%22round%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E) left no-repeat}.theChampPullOut{background:url(data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%220%200%2030%2030%22%3E%0A%3Cpath%20d%3D%22M%2023%206%20q%20-2%206%20-10%206%20v%20-6%20l%20-6%209%20l%206%209%20v%20-6%20q%2010%202%2010%20-12%22%20stroke-width%3D%221%22%20stroke%3D%22%23000%22%20fill%3D%22%23000%22%20stroke-linecap%3D%22round%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E) left no-repeat}.theChampCommentingTabs li{padding-left:0!important;float:left;margin:0 1em 0 0!important;list-style:none;color:#aaa;display:block;cursor:pointer;font-size:.85em}.theChampCommentingTabs ul{float:left;padding-left:0;margin-left:0}li.theChampSelectedTab{color:#333;border-bottom:2px solid #23a9e1}.fb-comments,.fb-comments span,.fb-comments span iframe[style]{min-width:100%!important;width:100%!important}#mc-input,#user_email,#user_login{height:auto!important}div.the_champ_horizontal_counter li{margin-right:14px!important}div.theChampTotalShareCount{word-wrap:normal!important;font-weight: bolder;font-family: sans-serif;padding: 0;margin: 0;text-align:center}div.theChampTotalShareText{word-wrap:normal!important;margin: 0;padding: 0;text-align: center;}.theChampAIMBackground{background-color: #10ff00}.theChampAmazonWishListBackground{background-color: #ffe000}.theChampAOLMailBackground{background-color: #2A2A2A}.theChampAppnetBackground{background-color: #5D5D5D}.theChampBalatarinBackground{background-color: #fff}.theChampBibSonomyBackground{background-color: #000}.theChampBittyBrowserBackground{background-color: #EFEFEF}.theChampBlinklistBackground{background-color: #3D3C3B}.theChampBloggerPostBackground{background-color: #FDA352}.theChampBlogMarksBackground{background-color: #535353}.theChampBookmarksfrBackground{background-color: #E8EAD4}.theChampBoxnetBackground{background-color: #1A74B0}.theChampBuddyMarksBackground{background-color: #ffd400}.theChampCare2NewsBackground{background-color: #6EB43F}.theChampCopyLinkBackground{background-color: #FFC112}.theChampCommentBackground{background-color: #444}.theChampCiteULikeBackground{background-color: #2781CD}.theChampDiaryRuBackground{background-color: #E8D8C6}.theChampDiasporaBackground{background-color: #0166FF}.theChampDiigoBackground{background-color: #4A8BCA}.theChampDoubanBackground{background-color: #497700}.theChampDraugiemBackground{background-color: #ffad66}.theChampDZoneBackground{background-color: #fff088}.theChampEvernoteBackground{background-color: #8BE056}.theChampFacebookMessengerBackground{background-color: #0084FF}.theChampFarkBackground{background-color: #555}.theChampFintelBackground{background-color:#087515}.theChampFlipboardBackground{background-color: #CC0000}.theChampFolkdBackground{background-color: #0F70B2}.theChampGoogleClassroomBackground{background-color: #FFC112}.theChampGoogleBookmarksBackground{background-color: #CB0909}.theChampGoogleGmailBackground{background-color: #E5E5E5}.theChampHackerNewsBackground{background-color: #F60}.theChampHatenaBackground{background-color: #00A6DB}.theChampInstapaperBackground{background-color: #EDEDED}.theChampJamespotBackground{background-color: #FF9E2C}.theChampKakaoBackground{background-color: #FCB700}.theChampKindleItBackground{background-color: #2A2A2A}.theChampKikBackground{background-color: #2A2A2A}.theChampKnownBackground{background-color: #fff101}.theChampLineBackground{background-color: #00C300}.theChampMailRuBackground{background-color: #356FAC}.theChampMendeleyBackground{background-color: #A70805}.theChampMeneameBackground{background-color: #FF7D12}.theChampMixiBackground{background-color: #EDEDED}.theChampMySpaceBackground{background-color: #2A2A2A}.theChampNetvouzBackground{background-color: #c0ff00}.theChampOdnoklassnikiBackground{background-color: #F2720C}.theChampOutlookcomBackground{background-color: #0072C6}.theChampPapalyBackground{background-color: #3AC0F6}.theChampPinboardBackground{background-color: #1341DE}.theChampPlurkBackground{background-color: #CF682F}.theChampPocketBackground{background-color: #f0f0f0}.theChampPrintFriendlyBackground{background-color: #61D1D5}.theChampProtopageBookmarksBackground{background-color: #413FFF}.theChampPushaBackground{background-color: #0072B8}.theChampQzoneBackground{background-color: #2B82D9}.theChampRefindBackground{background-color: #1492ef}.theChampRediffMyPageBackground{background-color: #D20000}.theChampRenrenBackground{background-color: #005EAC}.theChampSinaWeiboBackground{background-color: #ff0}.theChampSiteJotBackground{background-color: #ffc800}.theChampSkypeBackground{background-color: #00AFF0}.theChampSMSBackground{background-color: #6ebe45}.theChampSlashdotBackground{background-color: #004242}.theChampSvejoBackground{background-color: #fa7aa3}.theChampSymbalooFeedsBackground{background-color: #6DA8F7}.theChampTelegramBackground{background-color: #3DA5f1}.theChampThreemaBackground{background-color:#2A2A2A}.theChampTrelloBackground{background-color: #1189CE}.theChampTuentiBackground{background-color: #0075C9}.theChampTwiddlaBackground{background-color: #EDEDED}.theChampTypePadPostBackground{background-color: #2A2A2A}.theChampViadeoBackground{background-color: #2A2A2A}.theChampViberBackground{background-color: #8B628F}.theChampWaneloBackground{background-color: #fff}.theChampWebnewsBackground{background-color: #CC2512}.theChampWordPressBackground{background-color: #464646}.theChampWykopBackground{background-color: #367DA9}.theChampYahooMailBackground{background-color: #400090}.theChampYoolinkBackground{background-color: #A2C538}.theChampBehanceBackground{background-color: #053eff}.theChampFlickrBackground{background-color: #ff0084}.theChampFoursquareBackground{background-color: #f94877}.theChampGithubBackground{background-color: #2a2a2a}.theChampMediumBackground{background-color: #2a2a2a}.theChampOdnoklassnikiBackground{background-color: #F2720C}.theChampSnapchatBackground{background-color: #ffe900}.theChampVimeoBackground{background-color: #1ab7ea}.theChampYoutubeBackground{background-color: #ff0000}.theChampRSSBackground{background-color: #e3702d}.theChampGentleReaderBackground{background-color:#46aecf}.theChampBehanceSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-2%20-2%2036%2036%22%3E%3Cpath%20d%3D%22M3.862%208.136h5.66c1.377%200%203.19%200%204.13.566a3.705%203.705%200%200%201%201.837%203.26c0%201.66-.88%202.905-2.32%203.494v.042c1.924.397%202.97%201.838%202.97%203.76%200%202.297-1.636%204.483-4.743%204.483H3.86V8.14zm2.078%206.71h4.152c2.36%200%203.322-.856%203.322-2.493%200-2.16-1.53-2.468-3.322-2.468H5.94v4.96zm0%207.144h5.2c1.792%200%202.93-1.09%202.93-2.797%200-2.03-1.64-2.598-3.388-2.598H5.94v5.395zm22.017-1.833C27.453%2022.65%2025.663%2024%2023.127%2024c-3.607%200-5.31-2.49-5.422-5.944%200-3.386%202.23-5.878%205.31-5.878%204%200%205.225%203.74%205.116%206.47h-8.455c-.067%201.966%201.05%203.716%203.52%203.716%201.53%200%202.6-.742%202.928-2.206h1.838zm-1.793-3.15c-.088-1.77-1.42-3.19-3.256-3.19-1.946%200-3.106%201.466-3.236%203.19h6.492zM20.614%208h4.935v1.68h-4.94z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampFlickrSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-2%20-2%2036%2036%22%3E%3Cg%20fill%3D%22%23fff%22%3E%3Ccircle%20cx%3D%2223%22%20cy%3D%2216%22%20r%3D%226%22%3E%3C%2Fcircle%3E%3Ccircle%20cx%3D%229%22%20cy%3D%2216%22%20r%3D%226%22%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E') no-repeat center center}.theChampFoursquareSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-4%20-4%2040%2040%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M21.516%203H7.586C5.66%203%205%204.358%205%205.383v21.995c0%201.097.65%201.407.958%201.53.31.126%201.105.206%201.676-.36l6.72-7.455c.105-.12.49-.284.552-.284h4.184c1.79%200%201.81-1.45%201.997-2.206.157-.63%201.946-9.57%202.58-12.395.523-2.32-.104-3.21-2.15-3.21zM20.2%209.682c-.07.33-.368.66-.75.693h-5.44c-.61-.034-1.108.422-1.108%201.032v.665c0%20.61.5%201.24%201.108%201.24h4.607c.43%200%20.794.276.7.737-.093.46-.573%202.82-.627%203.07-.052.254-.282.764-.716.764h-3.62c-.682%200-1.36-.008-1.816.56-.458.573-4.534%205.293-4.534%205.293V6.403c0-.438.31-.746.715-.74h11.274c.41-.006.915.41.834%201L20.2%209.68z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampGithubSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-2%20-2%2036%2036%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M16%203.32c-7.182%200-13%205.82-13%2013%200%205.754%203.72%2010.612%208.89%2012.335.65.114.893-.276.893-.617%200-.31-.016-1.333-.016-2.42-3.266.6-4.11-.797-4.37-1.53-.147-.373-.78-1.527-1.334-1.835-.455-.244-1.105-.845-.016-.86%201.024-.017%201.755.942%202%201.332%201.17%201.966%203.038%201.414%203.785%201.073.114-.845.455-1.414.83-1.74-2.893-.324-5.916-1.445-5.916-6.418%200-1.414.504-2.584%201.333-3.494-.13-.325-.59-1.657.13-3.445%200%200%201.085-.34%203.57%201.337%201.04-.293%202.146-.44%203.25-.44s2.21.147%203.25.44c2.49-1.69%203.58-1.337%203.58-1.337.714%201.79.26%203.12.13%203.446.828.91%201.332%202.064%201.332%203.494%200%204.99-3.04%206.094-5.93%206.42.47.405.876%201.185.876%202.404%200%201.74-.016%203.136-.016%203.575%200%20.34.244.743.894.613C25.28%2026.933%2029%2022.053%2029%2016.32c0-7.182-5.817-13-13-13z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampSnapchatSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2032%2032%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M26.177%2020.978c-2.867-.473-4.157-3.414-4.21-3.54l-.01-.02c-.153-.31-.187-.57-.1-.772.164-.39.774-.583%201.177-.71.113-.037.22-.07.306-.105.715-.28%201.073-.625%201.066-1.03-.006-.312-.252-.593-.642-.732a1.168%201.168%200%200%200-.44-.084.975.975%200%200%200-.405.083c-.34.16-.65.246-.91.258a.789.789%200%200%201-.357-.087l.027-.45.005-.062c.09-1.432.203-3.215-.266-4.264C20.03%206.34%2017.073%206.1%2016.2%206.1h-.052l-.363.003c-.87%200-3.818.243-5.208%203.36-.47%201.05-.357%202.833-.268%204.264l.03.513a.83.83%200%200%201-.41.09c-.276%200-.6-.087-.97-.26a.795.795%200%200%200-.335-.067c-.43%200-.946.282-1.026.704-.06.305.077.748%201.054%201.134.087.036.193.07.305.105.403.128%201.012.322%201.18.71.084.203.05.463-.103.773l-.01.022c-.054.125-1.344%203.068-4.21%203.54a.437.437%200%200%200-.366.455.6.6%200%200%200%20.048.196c.216.504%201.123.87%202.775%201.13.055.075.113.34.148.5.036.16.07.32.12.494.05.17.18.374.514.374.133%200%20.292-.03.475-.067.275-.053.652-.127%201.124-.127.26%200%20.532.022.805.067.532.09.985.41%201.51.78.75.53%201.6%201.132%202.894%201.132.034%200%20.07%200%20.105-.005.04.002.095.004.153.004%201.29%200%202.142-.6%202.892-1.132.526-.37.978-.69%201.51-.78.274-.045.545-.068.807-.068.45%200%20.805.056%201.123.12.2.037.36.057.476.057h.024c.246%200%20.42-.13.488-.365.05-.17.086-.327.12-.49.037-.16.094-.422.15-.496%201.65-.256%202.56-.624%202.773-1.125a.568.568%200%200%200%20.047-.196.433.433%200%200%200-.363-.458z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampTumblrSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%22-2%20-2%2036%2036%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M20.775%2021.962c-.37.177-1.08.33-1.61.345-1.598.043-1.907-1.122-1.92-1.968v-6.217h4.007V11.1H17.26V6.02h-2.925s-.132.044-.144.15c-.17%201.556-.895%204.287-3.923%205.378v2.578h2.02v6.522c0%202.232%201.647%205.404%205.994%205.33%201.467-.025%203.096-.64%203.456-1.17l-.96-2.846z%22%2F%3E%3C%2Fsvg%3E') no-repeat center center}.theChampVimeoSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-2%20-2%2036%2036%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M26.926%2010.627c-.103%202.25-1.675%205.332-4.716%209.245C19.066%2023.957%2016.406%2026%2014.23%2026c-1.348%200-2.49-1.244-3.42-3.732l-1.867-6.844C8.25%2012.937%207.51%2011.69%206.715%2011.69c-.173%200-.778.365-1.815%201.09l-1.088-1.4a300.012%20300.012%200%200%200%203.374-3.01c1.522-1.315%202.666-2.007%203.427-2.076%201.8-.173%202.907%201.057%203.322%203.69.45%202.84.76%204.608.935%205.3.52%202.356%201.09%203.534%201.713%203.534.483%200%201.21-.764%202.18-2.294.97-1.528%201.488-2.692%201.558-3.49.14-1.32-.38-1.98-1.553-1.98-.554%200-1.125.126-1.712.378%201.137-3.722%203.308-5.53%206.513-5.426%202.378.068%203.498%201.61%203.36%204.62z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampRSSSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-4%20-4%2040%2040%22%3E%3Cg%20fill%3D%22%23fff%22%3E%3Cellipse%20cx%3D%227.952%22%20cy%3D%2224.056%22%20rx%3D%222.952%22%20ry%3D%222.944%22%3E%3C%2Fellipse%3E%3Cpath%20d%3D%22M5.153%2016.625c2.73%200%205.295%201.064%207.22%202.996a10.2%2010.2%200%200%201%202.996%207.255h4.2c0-7.962-6.47-14.44-14.42-14.44v4.193zm.007-7.432c9.724%200%2017.636%207.932%2017.636%2017.682H27C27%2014.812%2017.203%205%205.16%205v4.193z%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E') no-repeat center center}.theChampMeWeSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-3%20-3%2038%2038%22%3E%3Cg%20fill%3D%22%23fff%22%3E%3Cpath%20d%3D%22M9.636%2010.427a1.22%201.22%200%201%201-2.44%200%201.22%201.22%200%201%201%202.44%200zM15.574%2010.431a1.22%201.22%200%200%201-2.438%200%201.22%201.22%200%201%201%202.438%200zM22.592%2010.431a1.221%201.221%200%201%201-2.443%200%201.221%201.221%200%200%201%202.443%200zM29.605%2010.431a1.221%201.221%200%201%201-2.442%200%201.221%201.221%200%200%201%202.442%200zM3.605%2013.772c0-.471.374-.859.859-.859h.18c.374%200%20.624.194.789.457l2.935%204.597%202.95-4.611c.18-.291.43-.443.774-.443h.18c.485%200%20.859.387.859.859v8.113a.843.843%200%200%201-.859.845.857.857%200%200%201-.845-.845V16.07l-2.366%203.559c-.18.276-.402.443-.72.443-.304%200-.526-.167-.706-.443l-2.354-3.53V21.9c0%20.471-.374.83-.845.83a.815.815%200%200%201-.83-.83v-8.128h-.001zM14.396%2014.055a.9.9%200%200%201-.069-.333c0-.471.402-.83.872-.83.415%200%20.735.263.845.624l2.23%206.66%202.187-6.632c.139-.402.428-.678.859-.678h.124c.428%200%20.735.278.859.678l2.187%206.632%202.23-6.675c.126-.346.415-.609.83-.609.457%200%20.845.361.845.817a.96.96%200%200%201-.083.346l-2.867%208.032c-.152.43-.471.706-.887.706h-.165c-.415%200-.721-.263-.872-.706l-2.161-6.328-2.16%206.328c-.152.443-.47.706-.887.706h-.165c-.415%200-.72-.263-.887-.706l-2.865-8.032z%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E') no-repeat center center}.theChampYoutubeSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2032%2032%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M26.78%2011.6s-.215-1.515-.875-2.183c-.837-.876-1.774-.88-2.204-.932-3.075-.222-7.693-.222-7.693-.222h-.01s-4.618%200-7.697.222c-.43.05-1.368.056-2.205.932-.66.668-.874%202.184-.874%202.184S5%2013.386%205%2015.166v1.67c0%201.78.22%203.56.22%203.56s.215%201.516.874%202.184c.837.875%201.936.85%202.426.94%201.76.17%207.48.22%207.48.22s4.623-.007%207.7-.23c.43-.05%201.37-.056%202.205-.932.66-.668.875-2.184.875-2.184s.22-1.78.22-3.56v-1.67c0-1.78-.22-3.56-.22-3.56zm-13.052%207.254v-6.18l5.944%203.1-5.944%203.08z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E') no-repeat center center}.theChampTelegramSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-1%20-3%2036%2036%22%20width%3D%22100%25%22%20height%3D%22100%25%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M25.515%206.896L6.027%2014.41c-1.33.534-1.322%201.276-.243%201.606l5%201.56%201.72%205.66c.226.625.115.873.77.873.506%200%20.73-.235%201.012-.51l2.43-2.363%205.056%203.734c.93.514%201.602.25%201.834-.863l3.32-15.638c.338-1.363-.52-1.98-1.41-1.577z%22%2F%3E%3C%2Fsvg%3E') no-repeat center center}.theChampInstagramSvg{background:url('data:image/svg+xml;charset=utf8,%3Csvg%20id%3D%22Layer_1%22%20version%3D%221.1%22%20viewBox%3D%22-10%20-10%20148%20148%22%20xml%3Aspace%3D%22preserve%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%3Cg%3E%3Cg%3E%3Cpath%20d%3D%22M86%2C112H42c-14.336%2C0-26-11.663-26-26V42c0-14.337%2C11.664-26%2C26-26h44c14.337%2C0%2C26%2C11.663%2C26%2C26v44%20%20%20%20C112%2C100.337%2C100.337%2C112%2C86%2C112z%20M42%2C24c-9.925%2C0-18%2C8.074-18%2C18v44c0%2C9.925%2C8.075%2C18%2C18%2C18h44c9.926%2C0%2C18-8.075%2C18-18V42%20%20%20%20c0-9.926-8.074-18-18-18H42z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3Cg%3E%3Cpath%20d%3D%22M64%2C88c-13.234%2C0-24-10.767-24-24c0-13.234%2C10.766-24%2C24-24s24%2C10.766%2C24%2C24C88%2C77.233%2C77.234%2C88%2C64%2C88z%20M64%2C48c-8.822%2C0-16%2C7.178-16%2C16s7.178%2C16%2C16%2C16c8.822%2C0%2C16-7.178%2C16-16S72.822%2C48%2C64%2C48z%22%20fill%3D%22%23fff%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3Cg%3E%3Ccircle%20cx%3D%2289.5%22%20cy%3D%2238.5%22%20fill%3D%22%23fff%22%20r%3D%225.5%22%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E') no-repeat center center}.theChampWhatsappBackground a,i.theChampLineBackground a,i.theChampViberBackground a{display:inline!important}.the_champ_sharing_container a{padding:0!important;box-shadow:none!important;border:none!important}div.course_instructor_widget .the_champ_vertical_sharing{display:none!important;}@media screen and (max-width:783px){#the_champ_sharing_more_providers{width:80%;left:60%;margin-left:-50%;text-shadow:none!important}#the_champ_sharing_more_providers .filter input.search{border:1px solid #ccc;width:92%}}@media screen and (max-width:475px){#the_champ_sharing_more_content .all-services ul li{width:100%!important;}}#ss_openid{border:1px solid gray;display:inline;font-family:"Trebuchet MS";font-size:12px;width:98%;padding:.35em .325em .75em;margin-bottom:20px}#ss_openid form{margin-top:25px;margin-left:0;padding:0;background:transparent;-webkit-box-shadow:none;box-shadow:none}#ss_openid input{font-family:"Trebuchet MS";font-size:12px;width:100px;float:left}#ss_openid input[type=submit]{background:#767676;padding:.75em 2em;border:0;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;color:#fff;cursor:pointer;display:inline-block;font-weight:800;line-height:1;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}#ss_openid legend{color:#FF6200;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:table;max-width:100%;padding:0;white-space:normal}#ss_openid input.openid_login{background-color:#fff;background-position:0 50%;color:#000;width:220px;margin-right:10px;height:30px;margin-bottom:5px;background:#fff;background-image:-webkit-linear-gradient(rgba(255,255,255,0),rgba(255,255,255,0));border:1px solid #bbb;-webkit-border-radius:3px;border-radius:3px;display:block;padding:.7em;line-height:1.5}#ss_openid a{color:silver}#ss_openid a:hover{color:#5e5e5e}.heateor_ms_subscribe_option{line-height: 14px;margin-top: 8px;}.heateor_ms_subscribe_option input.heateor_ms_checkbox, .heateor_ms_subscribe_option label.heateor_ms_checkbox_label{float:left;font-size: 15px;margin: 0;color: #666;}.heateor_ms_subscribe_option input.heateor_ms_checkbox{margin: 0 4px 0 0;width: 15px;height: 15px;float: left;}div.heateor_ss_sl_optin_container{clear:both}div.heateor_ss_sl_optin_container a{color:blue}div.heateor_ss_sl_optin_container label{font-size:11px;font-weight:normal}input.heateor_ss_social_login_optin{vertical-align:middle}
helper.php CHANGED
@@ -18,9 +18,6 @@ function the_champ_login_notifications($loginOptions){
18
  if(in_array('facebook', $loginOptions['providers']) && (!isset($loginOptions['fb_key']) || $loginOptions['fb_key'] == '' || !isset($loginOptions['fb_secret']) || $loginOptions['fb_secret'] == '')){
19
  $errorHtml .= the_champ_error_message('Specify Facebook App ID and Secret in <strong>Super Socializer</strong> > <strong>Social Login</strong> section in admin panel for Facebook Login to work');
20
  }
21
- if(in_array('xing', $loginOptions['providers']) && (!isset($loginOptions['xing_ck']) || $loginOptions['xing_ck'] == '' || !isset($loginOptions['xing_cs']) || $loginOptions['xing_cs'] == '')){
22
- $errorHtml .= the_champ_error_message('Specify Xing Consumer Key and Secret in <strong>Super Socializer</strong> > <strong>Social Login</strong> section in admin panel for Xing Login to work');
23
- }
24
  if(in_array('twitter', $loginOptions['providers']) && (!isset($loginOptions['twitter_key']) || $loginOptions['twitter_key'] == '' || !isset($loginOptions['twitter_secret']) || $loginOptions['twitter_secret'] == '')){
25
  $errorHtml .= the_champ_error_message('Specify Twitter Consumer Key and Secret in <strong>Super Socializer</strong> > <strong>Social Login</strong> section in admin panel for Twitter Login to work');
26
  }
@@ -39,9 +36,6 @@ function the_champ_login_notifications($loginOptions){
39
  if(in_array('steam', $loginOptions['providers']) && (!isset($loginOptions['steam_api_key']) || $loginOptions['steam_api_key'] == '')){
40
  $errorHtml .= the_champ_error_message('Specify Steam API Key in <strong>Super Socializer</strong> > <strong>Social Login</strong> section in admin panel for Steam Login to work');
41
  }
42
- if(in_array('twitch', $loginOptions['providers']) && (!isset($loginOptions['twitch_client_id']) || $loginOptions['twitch_client_id'] == '' || !isset($loginOptions['twitch_client_secret']) || $loginOptions['twitch_client_secret'] == '')){
43
- $errorHtml .= the_champ_error_message('Specify Twitch Client ID and Secret in <strong>Super Socializer</strong> > <strong>Social Login</strong> section in admin panel for Twitch Login to work');
44
- }
45
  }
46
  return $errorHtml;
47
  }
@@ -279,7 +273,7 @@ function the_champ_ajax_response($response){
279
  function the_champ_notify(){
280
  if(isset($_GET['message'])){
281
  ?>
282
- <div><?php echo sanitize_text_field($_GET['message']) ?></div>
283
  <?php
284
  }
285
  die;
@@ -495,17 +489,12 @@ if(is_multisite() && is_main_site()){
495
 
496
  function the_champ_account_linking(){
497
  if(is_user_logged_in()){
498
- // LiveJournal auth
499
- if(isset($_GET['SuperSocializerAuth']) && sanitize_text_field($_GET['SuperSocializerAuth']) == 'LiveJournal'){
500
- the_champ_livejournal_auth();
501
- }
502
  wp_enqueue_style('the-champ-frontend-css', plugins_url('css/front.css', __FILE__), false, THE_CHAMP_SS_VERSION);
503
  global $theChampFacebookOptions, $theChampLoginOptions, $user_ID;
504
  $twitterRedirect = urlencode(the_champ_get_valid_url(the_champ_get_http().$_SERVER["HTTP_HOST"] . html_entity_decode(esc_url(remove_query_arg(array('linked'))))));
505
  $currentPageUrl = urldecode($twitterRedirect);
506
- $theChampLJAuthUrl = remove_query_arg('action', the_champ_get_valid_url($currentPageUrl));
507
  ?>
508
- <script>function theChampLoadEvent(e){var t=window.onload;if(typeof window.onload!="function"){window.onload=e}else{window.onload=function(){t();e()}}} var theChampCloseIconPath = '<?php echo plugins_url('images/close.png', __FILE__) ?>'; var theChampLJAuthUrl = '<?php echo $theChampLJAuthUrl . (strpos($theChampLJAuthUrl, '?') !== false ? '&' : '?') . 'SuperSocializerAuth=LiveJournal'; ?>'; var theChampLJLoginUsernameString = '<?php echo htmlspecialchars(__('Enter your LiveJournal username', 'super-socializer'), ENT_QUOTES); ?>';</script>
509
  <?php
510
  // general (required) scripts
511
  wp_enqueue_script('the_champ_ss_general_scripts', plugins_url('js/front/social_login/general.js', __FILE__), false, THE_CHAMP_SS_VERSION);
@@ -524,7 +513,7 @@ function the_champ_account_linking(){
524
  <style type="text/css">
525
  #ss_openid{border:1px solid gray;display:inline;font-family:"Trebuchet MS";font-size:12px;width:98%;padding:.35em .325em .75em;margin-bottom:20px}#ss_openid form{margin-top:25px;margin-left:0;padding:0;background:transparent;-webkit-box-shadow:none;box-shadow:none}#ss_openid input{font-family:"Trebuchet MS";font-size:12px;width:100px;float:left}#ss_openid input[type=submit]{background:#767676;padding:.75em 2em;border:0;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;color:#fff;cursor:pointer;display:inline-block;font-weight:800;line-height:1;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}#ss_openid legend{color:#FF6200;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:table;max-width:100%;padding:0;white-space:normal}#ss_openid input.openid_login{background-color:#fff;background-position:0 50%;color:#000;width:220px;margin-right:10px;height:30px;margin-bottom:5px;background:#fff;background-image:-webkit-linear-gradient(rgba(255,255,255,0),rgba(255,255,255,0));border:1px solid #bbb;-webkit-border-radius:3px;border-radius:3px;display:block;padding:.7em;line-height:1.5}#ss_openid a{color:silver}#ss_openid a:hover{color:#5e5e5e}
526
  </style>
527
- <script> var theChampLoadingImgPath = '<?php echo $loadingImagePath ?>'; var theChampAjaxUrl = '<?php echo $theChampAjaxUrl ?>'; var theChampRedirectionUrl = '<?php echo $redirectionUrl ?>'; var theChampRegRedirectionUrl = '<?php echo $regRedirectionUrl ?>', theChampSteamAuthUrl = "<?php echo $theChampSteamLogin ? $theChampSteamLogin->url( esc_url(home_url()) . '?SuperSocializerSteamAuth=' . $twitterRedirect ) : ''; ?>"; var heateorMSEnabled = 0; var theChampTwitterAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Twitter&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampFacebookAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Facebook&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampGoogleAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Google&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampVkontakteAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Vkontakte&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampTwitchAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Twitch&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampLinkedinAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Linkedin&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampXingAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Xing&super_socializer_redirect_to=" + theChampTwitterRedirect;</script>
528
  <?php
529
  $userVerified = false;
530
  $ajaxUrl = 'admin-ajax.php';
@@ -787,7 +776,7 @@ function the_champ_sharing_meta_setup(){
787
  <br/>
788
  <label for="the_champ_<?php echo $sharingProvider ?>_horizontal_sharing_count">
789
  <span style="width: 242px; float:left"><?php _e('Starting share count for ' . ucfirst(str_replace('_', ' ', $sharingProvider)), 'super-socializer') ?></span>
790
- <input type="text" name="_the_champ_meta[<?php echo $sharingProvider ?>_horizontal_count]" id="the_champ_<?php echo $sharingProvider ?>_horizontal_sharing_count" value="<?php echo isset($sharingMeta[$sharingProvider.'_horizontal_count']) ? $sharingMeta[$sharingProvider.'_horizontal_count'] : '' ?>" />
791
  </label>
792
  <?php
793
  }
@@ -806,7 +795,7 @@ function the_champ_sharing_meta_setup(){
806
  <br/>
807
  <label for="the_champ_<?php echo $sharingProvider ?>_vertical_sharing_count">
808
  <span style="width: 242px; float:left"><?php _e('Starting share count for ' . ucfirst(str_replace('_', ' ', $sharingProvider)), 'super-socializer') ?></span>
809
- <input type="text" name="_the_champ_meta[<?php echo $sharingProvider ?>_vertical_count]" id="the_champ_<?php echo $sharingProvider ?>_vertical_sharing_count" value="<?php echo isset($sharingMeta[$sharingProvider.'_vertical_count']) ? $sharingMeta[$sharingProvider.'_vertical_count'] : '' ?>" />
810
  </label>
811
  <?php
812
  }
@@ -839,13 +828,13 @@ function the_champ_save_sharing_meta($postId){
839
  return $postId;
840
  }
841
  }
842
- if ( isset( $_POST['_the_champ_meta'] ) ) {
843
  $newData = $_POST['_the_champ_meta'];
844
  foreach($newData as $k => $v){
845
- $newData[$k] = $v;
846
  }
847
  }else{
848
- $newData = array( 'sharing' => 0, 'vertical_sharing' => 0, 'counter' => 0, 'vertical_counter' => 0, 'fb_comments' => 0 );
849
  }
850
  update_post_meta($postId, '_the_champ_meta', $newData);
851
  return $postId;
18
  if(in_array('facebook', $loginOptions['providers']) && (!isset($loginOptions['fb_key']) || $loginOptions['fb_key'] == '' || !isset($loginOptions['fb_secret']) || $loginOptions['fb_secret'] == '')){
19
  $errorHtml .= the_champ_error_message('Specify Facebook App ID and Secret in <strong>Super Socializer</strong> > <strong>Social Login</strong> section in admin panel for Facebook Login to work');
20
  }
 
 
 
21
  if(in_array('twitter', $loginOptions['providers']) && (!isset($loginOptions['twitter_key']) || $loginOptions['twitter_key'] == '' || !isset($loginOptions['twitter_secret']) || $loginOptions['twitter_secret'] == '')){
22
  $errorHtml .= the_champ_error_message('Specify Twitter Consumer Key and Secret in <strong>Super Socializer</strong> > <strong>Social Login</strong> section in admin panel for Twitter Login to work');
23
  }
36
  if(in_array('steam', $loginOptions['providers']) && (!isset($loginOptions['steam_api_key']) || $loginOptions['steam_api_key'] == '')){
37
  $errorHtml .= the_champ_error_message('Specify Steam API Key in <strong>Super Socializer</strong> > <strong>Social Login</strong> section in admin panel for Steam Login to work');
38
  }
 
 
 
39
  }
40
  return $errorHtml;
41
  }
273
  function the_champ_notify(){
274
  if(isset($_GET['message'])){
275
  ?>
276
+ <div><?php echo esc_attr($_GET['message']) ?></div>
277
  <?php
278
  }
279
  die;
489
 
490
  function the_champ_account_linking(){
491
  if(is_user_logged_in()){
 
 
 
 
492
  wp_enqueue_style('the-champ-frontend-css', plugins_url('css/front.css', __FILE__), false, THE_CHAMP_SS_VERSION);
493
  global $theChampFacebookOptions, $theChampLoginOptions, $user_ID;
494
  $twitterRedirect = urlencode(the_champ_get_valid_url(the_champ_get_http().$_SERVER["HTTP_HOST"] . html_entity_decode(esc_url(remove_query_arg(array('linked'))))));
495
  $currentPageUrl = urldecode($twitterRedirect);
 
496
  ?>
497
+ <script>function theChampLoadEvent(e){var t=window.onload;if(typeof window.onload!="function"){window.onload=e}else{window.onload=function(){t();e()}}} var theChampCloseIconPath = '<?php echo plugins_url('images/close.png', __FILE__) ?>';</script>
498
  <?php
499
  // general (required) scripts
500
  wp_enqueue_script('the_champ_ss_general_scripts', plugins_url('js/front/social_login/general.js', __FILE__), false, THE_CHAMP_SS_VERSION);
513
  <style type="text/css">
514
  #ss_openid{border:1px solid gray;display:inline;font-family:"Trebuchet MS";font-size:12px;width:98%;padding:.35em .325em .75em;margin-bottom:20px}#ss_openid form{margin-top:25px;margin-left:0;padding:0;background:transparent;-webkit-box-shadow:none;box-shadow:none}#ss_openid input{font-family:"Trebuchet MS";font-size:12px;width:100px;float:left}#ss_openid input[type=submit]{background:#767676;padding:.75em 2em;border:0;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;color:#fff;cursor:pointer;display:inline-block;font-weight:800;line-height:1;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}#ss_openid legend{color:#FF6200;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:table;max-width:100%;padding:0;white-space:normal}#ss_openid input.openid_login{background-color:#fff;background-position:0 50%;color:#000;width:220px;margin-right:10px;height:30px;margin-bottom:5px;background:#fff;background-image:-webkit-linear-gradient(rgba(255,255,255,0),rgba(255,255,255,0));border:1px solid #bbb;-webkit-border-radius:3px;border-radius:3px;display:block;padding:.7em;line-height:1.5}#ss_openid a{color:silver}#ss_openid a:hover{color:#5e5e5e}
515
  </style>
516
+ <script> var theChampLoadingImgPath = '<?php echo $loadingImagePath ?>'; var theChampAjaxUrl = '<?php echo $theChampAjaxUrl ?>'; var theChampRedirectionUrl = '<?php echo $redirectionUrl ?>'; var theChampRegRedirectionUrl = '<?php echo $regRedirectionUrl ?>', theChampSteamAuthUrl = "<?php echo $theChampSteamLogin ? $theChampSteamLogin->url( esc_url(home_url()) . '?SuperSocializerSteamAuth=' . $twitterRedirect ) : ''; ?>"; var heateorMSEnabled = 0; var theChampTwitterAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Twitter&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampFacebookAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Facebook&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampGoogleAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Google&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampVkontakteAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Vkontakte&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampLinkedinAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Linkedin&super_socializer_redirect_to=" + theChampTwitterRedirect;</script>
517
  <?php
518
  $userVerified = false;
519
  $ajaxUrl = 'admin-ajax.php';
776
  <br/>
777
  <label for="the_champ_<?php echo $sharingProvider ?>_horizontal_sharing_count">
778
  <span style="width: 242px; float:left"><?php _e('Starting share count for ' . ucfirst(str_replace('_', ' ', $sharingProvider)), 'super-socializer') ?></span>
779
+ <input type="text" name="_the_champ_meta[<?php echo $sharingProvider ?>_horizontal_count]" id="the_champ_<?php echo $sharingProvider ?>_horizontal_sharing_count" value="<?php echo isset($sharingMeta[$sharingProvider.'_horizontal_count']) && $sharingMeta[$sharingProvider.'_horizontal_count'] > 0 ? $sharingMeta[$sharingProvider.'_horizontal_count'] : '' ?>" />
780
  </label>
781
  <?php
782
  }
795
  <br/>
796
  <label for="the_champ_<?php echo $sharingProvider ?>_vertical_sharing_count">
797
  <span style="width: 242px; float:left"><?php _e('Starting share count for ' . ucfirst(str_replace('_', ' ', $sharingProvider)), 'super-socializer') ?></span>
798
+ <input type="text" name="_the_champ_meta[<?php echo $sharingProvider ?>_vertical_count]" id="the_champ_<?php echo $sharingProvider ?>_vertical_sharing_count" value="<?php echo isset($sharingMeta[$sharingProvider.'_vertical_count']) && $sharingMeta[$sharingProvider.'_vertical_count'] > 0 ? $sharingMeta[$sharingProvider.'_vertical_count'] : '' ?>" />
799
  </label>
800
  <?php
801
  }
828
  return $postId;
829
  }
830
  }
831
+ if(isset($_POST['_the_champ_meta'])){
832
  $newData = $_POST['_the_champ_meta'];
833
  foreach($newData as $k => $v){
834
+ $newData[$k] = intval(sanitize_text_field(trim($v)));
835
  }
836
  }else{
837
+ $newData = array('sharing' => 0, 'vertical_sharing' => 0, 'counter' => 0, 'vertical_counter' => 0, 'fb_comments' => 0);
838
  }
839
  update_post_meta($postId, '_the_champ_meta', $newData);
840
  return $postId;
images/roihunter.png DELETED
Binary file
inc/shortcode.php CHANGED
@@ -228,7 +228,7 @@ function the_champ_login_shortcode($params){
228
  $html .= the_champ_login_button(true);
229
  $html .= '</div><div style="clear:both"></div>';
230
  if($redirect_url){
231
- $html .= '<script type="text/javascript">theChampCustomRedirect = encodeURI("'. $redirect_url .'"); var theChampLJAuthUrl = "'. $redirect_url .'?SuperSocializerAuth=LiveJournal"; var theChampSteamAuthUrl = ""; var theChampTwitterAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Twitter&super_socializer_redirect_to=" + theChampCustomRedirect; var theChampFacebookAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Facebook&super_socializer_redirect_to=" + theChampCustomRedirect; var theChampTwitchAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Twitch&super_socializer_redirect_to=" + theChampCustomRedirect; var theChampGoogleAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Google&super_socializer_redirect_to=" + theChampCustomRedirect; var theChampVkontakteAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Vkontakte&super_socializer_redirect_to=" + theChampCustomRedirect; var theChampLinkedinAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Linkedin&super_socializer_redirect_to=" + theChampCustomRedirect; var theChampXingAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Xing&super_socializer_redirect_to=" + theChampCustomRedirect</script>';
232
  }
233
  }
234
  return $html;
228
  $html .= the_champ_login_button(true);
229
  $html .= '</div><div style="clear:both"></div>';
230
  if($redirect_url){
231
+ $html .= '<script type="text/javascript">theChampCustomRedirect = encodeURI("'. $redirect_url .'");var theChampSteamAuthUrl = ""; var theChampTwitterAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Twitter&super_socializer_redirect_to=" + theChampCustomRedirect; var theChampFacebookAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Facebook&super_socializer_redirect_to=" + theChampCustomRedirect; var theChampGoogleAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Google&super_socializer_redirect_to=" + theChampCustomRedirect; var theChampVkontakteAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Vkontakte&super_socializer_redirect_to=" + theChampCustomRedirect; var theChampLinkedinAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Linkedin&super_socializer_redirect_to=" + theChampCustomRedirect;</script>';
232
  }
233
  }
234
  return $html;
inc/social_login.php CHANGED
@@ -435,28 +435,6 @@ function the_champ_sanitize_profile_data($profileData, $provider){
435
  $temp['link'] = isset($profileData->profileurl) ? $profileData->profileurl : '';
436
  $temp['avatar'] = isset($profileData->avatarmedium) && heateor_ss_validate_url($profileData->avatarmedium) !== false ? $profileData->avatarmedium : '';
437
  $temp['large_avatar'] = isset($profileData->avatarfull) && heateor_ss_validate_url($profileData->avatarfull) !== false ? $profileData->avatarfull : '';
438
- }elseif($provider == 'twitch'){
439
- $temp['id'] = isset($profileData['_id']) ? sanitize_text_field($profileData['_id']) : '';
440
- $temp['email'] = isset($profileData['email']) ? sanitize_text_field($profileData['email']) : '';
441
- $temp['name'] = isset($profileData['name']) ? sanitize_text_field($profileData['name']) : '';
442
- $temp['username'] = isset($profileData['display_name']) ? sanitize_text_field($profileData['display_name']) : '';
443
- $temp['first_name'] = '';
444
- $temp['last_name'] = '';
445
- $temp['bio'] = isset($profileData['bio']) ? sanitize_text_field($profileData['bio']) : '';
446
- $temp['link'] = '';
447
- $temp['avatar'] = isset($profileData['logo']) && heateor_ss_validate_url($profileData['logo']) !== false ? $profileData['logo'] : '';
448
- $temp['large_avatar'] = isset($profileData['logo']) && heateor_ss_validate_url($profileData['logo']) !== false ? $profileData['logo'] : '';
449
- }elseif($provider == 'xing'){
450
- $temp['id'] = isset($profileData -> id) ? sanitize_text_field($profileData -> id) : '';
451
- $temp['email'] = isset($profileData -> active_email) ? sanitize_email($profileData -> active_email) : '';;
452
- $temp['name'] = isset($profileData -> display_name) ? $profileData -> display_name : '';
453
- $temp['username'] = '';
454
- $temp['first_name'] = isset($profileData -> first_name) ? $profileData -> first_name : '';
455
- $temp['last_name'] = isset($profileData -> last_name) ? $profileData -> last_name : '';
456
- $temp['bio'] = '';
457
- $temp['link'] = isset($profileData -> permalink) && heateor_ss_validate_url($profileData -> permalink) !== false ? trim($profileData -> permalink) : '';
458
- $temp['avatar'] = isset($profileData -> photo_urls -> medium_thumb) && heateor_ss_validate_url($profileData -> photo_urls -> medium_thumb) !== false ? trim($profileData -> photo_urls -> medium_thumb) : '';
459
- $temp['large_avatar'] = isset($profileData -> photo_urls -> size_original) && heateor_ss_validate_url($profileData -> photo_urls -> size_original) !== false ? trim($profileData -> photo_urls -> size_original) : '';
460
  }elseif($provider == 'linkedin'){
461
  $temp['id'] = isset($profileData['id']) ? sanitize_text_field($profileData['id']) : '';
462
  $temp['email'] = isset($profileData['email']) ? sanitize_email($profileData['email']) : '';
@@ -501,19 +479,8 @@ function the_champ_sanitize_profile_data($profileData, $provider){
501
  $temp['link'] = isset($profileData -> website) && heateor_ss_validate_url($profileData -> website) !== false ? trim($profileData -> website) : '';
502
  $temp['avatar'] = isset($profileData -> profile_picture) && heateor_ss_validate_url($profileData -> profile_picture) !== false ? trim($profileData -> profile_picture) : '';
503
  $temp['large_avatar'] = '';
504
- }elseif($provider == 'liveJournal' && isset($profileData['username']) && $profileData['username']){
505
- $temp['email'] = '';
506
- $temp['bio'] = '';
507
- $temp['username'] = $profileData['username'];
508
- $temp['link'] = heateor_ss_validate_url($profileData['link']) !== false ? trim($profileData['link']) : '';
509
- $temp['avatar'] = heateor_ss_validate_url($profileData['avatar']) !== false ? trim($profileData['avatar']) : '';
510
- $temp['name'] = $profileData['name'];
511
- $temp['first_name'] = $profileData['first_name'];
512
- $temp['last_name'] = $profileData['last_name'];
513
- $temp['id'] = isset($profileData['username']) ? sanitize_text_field($profileData['username']) . '-lj' : '';
514
- $temp['large_avatar'] = '';
515
  }
516
- if($provider != 'steam' && $provider != 'liveJournal'){
517
  $temp['avatar'] = str_replace( 'http://', '//', $temp['avatar'] );
518
  $temp['large_avatar'] = str_replace( 'http://', '//', $temp['large_avatar'] );
519
  }
@@ -547,7 +514,7 @@ function the_champ_user_auth($profileData, $provider = 'facebook', $twitterRedir
547
  if(isset($existingUser[0] -> ID)){
548
  // check if account needs verification
549
  if(get_user_meta($existingUser[0] -> ID, 'thechamp_key', true) != ''){
550
- if(!in_array($profileData['provider'], array('twitter', 'instagram', 'steam', 'liveJournal', 'twitch'))){
551
  if(is_user_logged_in()){
552
  wp_delete_user($existingUser[0] -> ID);
553
  the_champ_link_account($socialId, $provider, $user_ID);
435
  $temp['link'] = isset($profileData->profileurl) ? $profileData->profileurl : '';
436
  $temp['avatar'] = isset($profileData->avatarmedium) && heateor_ss_validate_url($profileData->avatarmedium) !== false ? $profileData->avatarmedium : '';
437
  $temp['large_avatar'] = isset($profileData->avatarfull) && heateor_ss_validate_url($profileData->avatarfull) !== false ? $profileData->avatarfull : '';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
438
  }elseif($provider == 'linkedin'){
439
  $temp['id'] = isset($profileData['id']) ? sanitize_text_field($profileData['id']) : '';
440
  $temp['email'] = isset($profileData['email']) ? sanitize_email($profileData['email']) : '';
479
  $temp['link'] = isset($profileData -> website) && heateor_ss_validate_url($profileData -> website) !== false ? trim($profileData -> website) : '';
480
  $temp['avatar'] = isset($profileData -> profile_picture) && heateor_ss_validate_url($profileData -> profile_picture) !== false ? trim($profileData -> profile_picture) : '';
481
  $temp['large_avatar'] = '';
 
 
 
 
 
 
 
 
 
 
 
482
  }
483
+ if($provider != 'steam'){
484
  $temp['avatar'] = str_replace( 'http://', '//', $temp['avatar'] );
485
  $temp['large_avatar'] = str_replace( 'http://', '//', $temp['large_avatar'] );
486
  }
514
  if(isset($existingUser[0] -> ID)){
515
  // check if account needs verification
516
  if(get_user_meta($existingUser[0] -> ID, 'thechamp_key', true) != ''){
517
+ if(!in_array($profileData['provider'], array('twitter', 'instagram', 'steam'))){
518
  if(is_user_logged_in()){
519
  wp_delete_user($existingUser[0] -> ID);
520
  the_champ_link_account($socialId, $provider, $user_ID);
js/front/combined.js CHANGED
@@ -1,9 +1,9 @@
1
  theChampFBKey = typeof theChampFBKey != 'undefined' ? theChampFBKey : '', theChampFBLang = typeof theChampFBLang != 'undefined' ? theChampFBLang : theChampDefaultLang, theChampFbIosLogin = typeof theChampFbIosLogin != 'undefined' ? theChampFbIosLogin : 0;
2
  // general.js
3
  function theChampPopup(e){window.open(e,"_blank","height=520,width=770,left=315,top=80,resizable,scrollbars,toolbar=0,personalbar=0,menubar=no,location=no,directories=no,status")}function theChampStrReplace(e,t,n){for(var r=0;r<e.length;r++){n=n.replace(new RegExp(e[r],"g"),t[r])}return n}function theChampCallAjax(e){if(typeof jQuery!="undefined"){e()}else{theChampGetScript("https://code.jquery.com/jquery-latest.min.js",e)}}function theChampGetScript(e,t){var n=document.createElement("script");n.src=e;var r=document.getElementsByTagName("head")[0],i=false;n.onload=n.onreadystatechange=function(){if(!i&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){i=true;t();n.onload=n.onreadystatechange=null;r.removeChild(n)}};r.appendChild(n)}function theChampGetElementsByClass(e,t){if(e.getElementsByClassName){return e.getElementsByClassName(t)}else{return function(e,t){if(t==null){t=document}var n=[],r=t.getElementsByTagName("*"),i=r.length,s=new RegExp("(^|\\s)"+e+"(\\s|$)"),o,u;for(o=0,u=0;o<i;o++){if(s.test(r[o].className)){n[u]=r[o];u++}}return n}(t,e)}}if(typeof String.prototype.trim!=="function"){String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}}
4
- function heateorSsLJLoginPopup(){var a=document.createElement("div");a.innerHTML='<button id="heateor_ss_lj_popup_close" class="close-button separated"><img src="'+theChampCloseIconPath+'" /></button><div id="the_champ_sharing_more_content"><div class="all-services" style="padding:20px 10px 0px 10px;height:auto;"><fieldset id="ss_openid"><legend>LiveJournal Login</legend><form action="'+theChampLJAuthUrl+'" method="post" onsubmit="this.login.disabled=true;"><input type="hidden" name="openid_action" value="SuperSocializerLogin"><div style="clear:both">'+theChampLJLoginUsernameString+'</div><div style="clear:both"><input type="text" name="openid_url" required class="openid_login"><input type="submit" name="login" value="Login"></div></form></fieldset></div></div></div>',a.setAttribute("id","the_champ_sharing_more_providers"),a.setAttribute("style","height:auto;");var b=document.createElement("div");b.setAttribute("id","heateor_ss_lj_popup_bg"),jQuery("body").append(a).append(b),document.getElementById("heateor_ss_lj_popup_bg").onclick=document.getElementById("heateor_ss_lj_popup_close").onclick=function(){a.parentNode.removeChild(a),b.parentNode.removeChild(b)}}function theChampGetCookie(e){for(var t=e+"=",a=document.cookie.split(";"),h=0;h<a.length;h++){for(var i=a[h];" "==i.charAt(0);)i=i.substring(1,i.length);if(0==i.indexOf(t))return i.substring(t.length,i.length)}return null}
5
  // common.js
6
- function theChampLoginPopup(e){if("undefined"!=typeof theChampSameTabLogin&&theChampSameTabLogin==1){location.href=e}else{window.open(e,"_blank","height=520,width=770,left=315,top=80,resizable,scrollbars,toolbar=0,personalbar=0,menubar=no,location=no,directories=no,status")}}function theChampLoadingIcon(){jQuery(".the_champ_login_container").html('<img id="the_champ_loading_image" src="'+theChampLoadingImgPath+'" />')}function theChampInitiateLogin(e){var t=jQuery(e).parents("div.the_champ_login_container").find(".heateor_ss_social_login_optin");if(0==t.length||jQuery(t).is(":checked")){var a=e.getAttribute("alt");"Login with Facebook"==a?theChampLoginPopup(theChampFacebookAuthUrl):"Login with Twitch"==a?theChampLoginPopup(theChampTwitchAuthUrl):"Login with LiveJournal"==a?heateorSsLJLoginPopup():"Login with Steam"==a?theChampLoginPopup(theChampSteamAuthUrl):"Login with Twitter"==a?theChampLoginPopup(theChampTwitterAuthUrl):"Login with Xing"==a?theChampLoginPopup(theChampXingAuthUrl):("Login with Linkedin"==a&&theChampLoginPopup(theChampLinkedinAuthUrl),"Login with Google"==a?theChampLoginPopup(theChampGoogleAuthUrl):"Login with Vkontakte"==a?theChampLoginPopup(theChampVkontakteAuthUrl):"Login with Instagram"==a&&theChampInitializeInstaLogin())}else t.length>0&&jQuery(t).parent().css("color","red")}function theChampDisplayLoginIcon(e,t){if("undefined"!=typeof jQuery)for(var a=0;a<t.length;a++)jQuery("."+t[a]).css("display","block");else for(a=0;a<t.length;a++)for(var h=theChampGetElementsByClass(e,t[a]),i=0;i<h.length;i++)h[i].style.display="block"}function theChampValidateEmail(e){return/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)}function the_champ_save_email(e){var t=document.getElementById("the_champ_email").value.trim(),a=document.getElementById("the_champ_confirm_email").value.trim();return"save"!=e.id||theChampValidateEmail(t)?t!=a?(document.getElementById("the_champ_error").innerHTML="Email addresses do not match",void jQuery("#TB_ajaxContent").css("height","auto")):void theChampCallAjax(function(){theChampSaveEmail(e.id,t)}):(document.getElementById("the_champ_error").innerHTML=theChampEmailPopupErrorMsg,void jQuery("#TB_ajaxContent").css("height","auto"))}function theChampSaveEmail(e,t){document.getElementById("the_champ_error").innerHTML='<img src="'+theChampLoadingImgPath+'" />',jQuery.ajax({type:"POST",dataType:"json",url:theChampAjaxUrl,data:{action:"the_champ_save_email",elemId:e,email:t,id:theChampEmailPopupUniqueId},success:function(e){window.history.pushState({html:"html",pageTitle:"page title"},"","?done=1"),1==e.status&&e.message.response&&"success"==e.message.response?location.href=e.message.url:1==e.status&&"success"==e.message?location.href=theChampRegRedirectionUrl:1==e.status&&"cancelled"==e.message?tb_remove():1==e.status&&"verify"==e.message?document.getElementById("TB_ajaxContent").innerHTML="<strong>"+theChampEmailPopupVerifyMessage+"</strong>":0==e.status&&(document.getElementById("the_champ_error").innerHTML=e.message,jQuery("#TB_ajaxContent").css("height","auto"))},error:function(e,t,a){location.href=decodeURIComponent(theChampRedirectionUrl)}})}function theChampCapitaliseFirstLetter2(e){return e.charAt(0).toUpperCase()+e.slice(1)}if(void 0===theChampLinkingRedirection)var theChampLinkingRedirection="";theChampVerified&&theChampLoadEvent(function(){tb_show(theChampPopupTitle,theChampAjaxUrl)}),theChampEmailPopup&&theChampLoadEvent(function(){tb_show(theChampEmailPopupTitle,theChampEmailAjaxUrl)});var theChampCommentFormLogin=!1;theChampLoadEvent(function(){null!=theChampGetCookie("heateorSsSLOptin")&&jQuery("input.heateor_ss_social_login_optin").prop("checked",!0)}),jQuery("input.heateor_ss_social_login_optin").click(function(){if(jQuery(this).is(":checked")){if(null==theChampGetCookie("heateorSsSLOptin")){var e=new Date;e.setTime(e.getTime()+31536e6),document.cookie="heateorSsSLOptin=1; expires="+e.toUTCString()+"; path=/"}}else document.cookie="heateorSsSLOptin=; expires=Fri, 02 Jan 1970 00:00:00 UTC; path=/"});
7
  // instagram.js
8
  var heateorSsParentWindow=window.opener?window.opener:window;function theChampInitializeInstaLogin(){var e=typeof theChampLinkingRedirection!="undefined"&&theChampLinkingRedirection!=""?theChampLinkingRedirection:theChampTwitterRedirect;theChampLoginPopup("https://instagram.com/oauth/authorize/?client_id="+theChampInstaId+"&redirect_uri="+encodeURI(theChampSiteUrl+"?ssredirect="+e)+"&response_type=token")}function theChampGetHashValue(e){if(typeof e!=="string"){e=""}else{e=e.toLowerCase()}var t=location.hash.toLowerCase().match(new RegExp(e+"=([^&]*)"));var n="";if(t){n=t[1]}return n}function theChampGetParameterByName(e){e=e.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var t=new RegExp("[\\?&]"+e+"=([^&#]*)"),n=t.exec(location.search);return n===null?"":decodeURIComponent(n[1].replace(/\+/g," "))}var theChampInstagramHash=theChampGetHashValue("access_token");if(theChampInstagramHash!=""){var redirection = theChampGetParameterByName("ssredirect");redirection = redirection + (heateorSsParentWindow.heateorMSEnabled == 1 ? (redirection.indexOf('?') >= 0 ? '&' : '?') + "heateorMSEnabled=1" : '');heateorSsParentWindow.location.href=theChampSiteUrl+"?SuperSocializerInstaToken="+theChampInstagramHash+"&super_socializer_redirect_to="+(redirection?redirection:theChampTwitterRedirect);window.close()}
9
  // sdk.js
1
  theChampFBKey = typeof theChampFBKey != 'undefined' ? theChampFBKey : '', theChampFBLang = typeof theChampFBLang != 'undefined' ? theChampFBLang : theChampDefaultLang, theChampFbIosLogin = typeof theChampFbIosLogin != 'undefined' ? theChampFbIosLogin : 0;
2
  // general.js
3
  function theChampPopup(e){window.open(e,"_blank","height=520,width=770,left=315,top=80,resizable,scrollbars,toolbar=0,personalbar=0,menubar=no,location=no,directories=no,status")}function theChampStrReplace(e,t,n){for(var r=0;r<e.length;r++){n=n.replace(new RegExp(e[r],"g"),t[r])}return n}function theChampCallAjax(e){if(typeof jQuery!="undefined"){e()}else{theChampGetScript("https://code.jquery.com/jquery-latest.min.js",e)}}function theChampGetScript(e,t){var n=document.createElement("script");n.src=e;var r=document.getElementsByTagName("head")[0],i=false;n.onload=n.onreadystatechange=function(){if(!i&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){i=true;t();n.onload=n.onreadystatechange=null;r.removeChild(n)}};r.appendChild(n)}function theChampGetElementsByClass(e,t){if(e.getElementsByClassName){return e.getElementsByClassName(t)}else{return function(e,t){if(t==null){t=document}var n=[],r=t.getElementsByTagName("*"),i=r.length,s=new RegExp("(^|\\s)"+e+"(\\s|$)"),o,u;for(o=0,u=0;o<i;o++){if(s.test(r[o].className)){n[u]=r[o];u++}}return n}(t,e)}}if(typeof String.prototype.trim!=="function"){String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}}
4
+ function theChampGetCookie(e){for(var t=e+"=",a=document.cookie.split(";"),h=0;h<a.length;h++){for(var i=a[h];" "==i.charAt(0);)i=i.substring(1,i.length);if(0==i.indexOf(t))return i.substring(t.length,i.length)}return null}
5
  // common.js
6
+ function theChampLoginPopup(e){if("undefined"!=typeof theChampSameTabLogin&&theChampSameTabLogin==1){location.href=e}else{window.open(e,"_blank","height=520,width=770,left=315,top=80,resizable,scrollbars,toolbar=0,personalbar=0,menubar=no,location=no,directories=no,status")}}function theChampLoadingIcon(){jQuery(".the_champ_login_container").html('<img id="the_champ_loading_image" src="'+theChampLoadingImgPath+'" />')}function theChampInitiateLogin(e){var t=jQuery(e).parents("div.the_champ_login_container").find(".heateor_ss_social_login_optin");if(0==t.length||jQuery(t).is(":checked")){var a=e.getAttribute("alt");"Login with Facebook"==a?theChampLoginPopup(theChampFacebookAuthUrl):"Login with Steam"==a?theChampLoginPopup(theChampSteamAuthUrl):"Login with Twitter"==a?theChampLoginPopup(theChampTwitterAuthUrl):("Login with Linkedin"==a&&theChampLoginPopup(theChampLinkedinAuthUrl),"Login with Google"==a?theChampLoginPopup(theChampGoogleAuthUrl):"Login with Vkontakte"==a?theChampLoginPopup(theChampVkontakteAuthUrl):"Login with Instagram"==a&&theChampInitializeInstaLogin())}else t.length>0&&jQuery(t).parent().css("color","red")}function theChampDisplayLoginIcon(e,t){if("undefined"!=typeof jQuery)for(var a=0;a<t.length;a++)jQuery("."+t[a]).css("display","block");else for(a=0;a<t.length;a++)for(var h=theChampGetElementsByClass(e,t[a]),i=0;i<h.length;i++)h[i].style.display="block"}function theChampValidateEmail(e){return/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)}function the_champ_save_email(e){var t=document.getElementById("the_champ_email").value.trim(),a=document.getElementById("the_champ_confirm_email").value.trim();return"save"!=e.id||theChampValidateEmail(t)?t!=a?(document.getElementById("the_champ_error").innerHTML="Email addresses do not match",void jQuery("#TB_ajaxContent").css("height","auto")):void theChampCallAjax(function(){theChampSaveEmail(e.id,t)}):(document.getElementById("the_champ_error").innerHTML=theChampEmailPopupErrorMsg,void jQuery("#TB_ajaxContent").css("height","auto"))}function theChampSaveEmail(e,t){document.getElementById("the_champ_error").innerHTML='<img src="'+theChampLoadingImgPath+'" />',jQuery.ajax({type:"POST",dataType:"json",url:theChampAjaxUrl,data:{action:"the_champ_save_email",elemId:e,email:t,id:theChampEmailPopupUniqueId},success:function(e){window.history.pushState({html:"html",pageTitle:"page title"},"","?done=1"),1==e.status&&e.message.response&&"success"==e.message.response?location.href=e.message.url:1==e.status&&"success"==e.message?location.href=theChampRegRedirectionUrl:1==e.status&&"cancelled"==e.message?tb_remove():1==e.status&&"verify"==e.message?document.getElementById("TB_ajaxContent").innerHTML="<strong>"+theChampEmailPopupVerifyMessage+"</strong>":0==e.status&&(document.getElementById("the_champ_error").innerHTML=e.message,jQuery("#TB_ajaxContent").css("height","auto"))},error:function(e,t,a){location.href=decodeURIComponent(theChampRedirectionUrl)}})}function theChampCapitaliseFirstLetter2(e){return e.charAt(0).toUpperCase()+e.slice(1)}if(void 0===theChampLinkingRedirection)var theChampLinkingRedirection="";theChampVerified&&theChampLoadEvent(function(){tb_show(theChampPopupTitle,theChampAjaxUrl)}),theChampEmailPopup&&theChampLoadEvent(function(){tb_show(theChampEmailPopupTitle,theChampEmailAjaxUrl)});var theChampCommentFormLogin=!1;theChampLoadEvent(function(){null!=theChampGetCookie("heateorSsSLOptin")&&jQuery("input.heateor_ss_social_login_optin").prop("checked",!0)}),jQuery("input.heateor_ss_social_login_optin").click(function(){if(jQuery(this).is(":checked")){if(null==theChampGetCookie("heateorSsSLOptin")){var e=new Date;e.setTime(e.getTime()+31536e6),document.cookie="heateorSsSLOptin=1; expires="+e.toUTCString()+"; path=/"}}else document.cookie="heateorSsSLOptin=; expires=Fri, 02 Jan 1970 00:00:00 UTC; path=/"});
7
  // instagram.js
8
  var heateorSsParentWindow=window.opener?window.opener:window;function theChampInitializeInstaLogin(){var e=typeof theChampLinkingRedirection!="undefined"&&theChampLinkingRedirection!=""?theChampLinkingRedirection:theChampTwitterRedirect;theChampLoginPopup("https://instagram.com/oauth/authorize/?client_id="+theChampInstaId+"&redirect_uri="+encodeURI(theChampSiteUrl+"?ssredirect="+e)+"&response_type=token")}function theChampGetHashValue(e){if(typeof e!=="string"){e=""}else{e=e.toLowerCase()}var t=location.hash.toLowerCase().match(new RegExp(e+"=([^&]*)"));var n="";if(t){n=t[1]}return n}function theChampGetParameterByName(e){e=e.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var t=new RegExp("[\\?&]"+e+"=([^&#]*)"),n=t.exec(location.search);return n===null?"":decodeURIComponent(n[1].replace(/\+/g," "))}var theChampInstagramHash=theChampGetHashValue("access_token");if(theChampInstagramHash!=""){var redirection = theChampGetParameterByName("ssredirect");redirection = redirection + (heateorSsParentWindow.heateorMSEnabled == 1 ? (redirection.indexOf('?') >= 0 ? '&' : '?') + "heateorMSEnabled=1" : '');heateorSsParentWindow.location.href=theChampSiteUrl+"?SuperSocializerInstaToken="+theChampInstagramHash+"&super_socializer_redirect_to="+(redirection?redirection:theChampTwitterRedirect);window.close()}
9
  // sdk.js
js/front/social_login/common.js CHANGED
@@ -1 +1 @@
1
- function theChampLoginPopup(e){if("undefined"!=typeof theChampSameTabLogin&&theChampSameTabLogin==1){location.href=e}else{window.open(e,"_blank","height=520,width=770,left=315,top=80,resizable,scrollbars,toolbar=0,personalbar=0,menubar=no,location=no,directories=no,status")}}function theChampLoadingIcon(){jQuery(".the_champ_login_container").html('<img id="the_champ_loading_image" src="'+theChampLoadingImgPath+'" />')}function theChampInitiateLogin(e){var t=jQuery(e).parents("div.the_champ_login_container").find(".heateor_ss_social_login_optin");if(0==t.length||jQuery(t).is(":checked")){var a=e.getAttribute("alt");"Login with Facebook"==a?theChampLoginPopup(theChampFacebookAuthUrl):"Login with Twitch"==a?theChampLoginPopup(theChampTwitchAuthUrl):"Login with LiveJournal"==a?heateorSsLJLoginPopup():"Login with Steam"==a?theChampLoginPopup(theChampSteamAuthUrl):"Login with Twitter"==a?theChampLoginPopup(theChampTwitterAuthUrl):"Login with Xing"==a?theChampLoginPopup(theChampXingAuthUrl):("Login with Linkedin"==a&&theChampLoginPopup(theChampLinkedinAuthUrl),"Login with Google"==a?theChampLoginPopup(theChampGoogleAuthUrl):"Login with Vkontakte"==a?theChampLoginPopup(theChampVkontakteAuthUrl):"Login with Instagram"==a&&theChampInitializeInstaLogin())}else t.length>0&&jQuery(t).parent().css("color","red")}function theChampDisplayLoginIcon(e,t){if("undefined"!=typeof jQuery)for(var a=0;a<t.length;a++)jQuery("."+t[a]).css("display","block");else for(a=0;a<t.length;a++)for(var h=theChampGetElementsByClass(e,t[a]),i=0;i<h.length;i++)h[i].style.display="block"}function theChampValidateEmail(e){return/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)}function the_champ_save_email(e){var t=document.getElementById("the_champ_email").value.trim(),a=document.getElementById("the_champ_confirm_email").value.trim();return"save"!=e.id||theChampValidateEmail(t)?t!=a?(document.getElementById("the_champ_error").innerHTML="Email addresses do not match",void jQuery("#TB_ajaxContent").css("height","auto")):void theChampCallAjax(function(){theChampSaveEmail(e.id,t)}):(document.getElementById("the_champ_error").innerHTML=theChampEmailPopupErrorMsg,void jQuery("#TB_ajaxContent").css("height","auto"))}function theChampSaveEmail(e,t){document.getElementById("the_champ_error").innerHTML='<img src="'+theChampLoadingImgPath+'" />',jQuery.ajax({type:"POST",dataType:"json",url:theChampAjaxUrl,data:{action:"the_champ_save_email",elemId:e,email:t,id:theChampEmailPopupUniqueId},success:function(e){window.history.pushState({html:"html",pageTitle:"page title"},"","?done=1"),1==e.status&&e.message.response&&"success"==e.message.response?location.href=e.message.url:1==e.status&&"success"==e.message?location.href=theChampRegRedirectionUrl:1==e.status&&"cancelled"==e.message?tb_remove():1==e.status&&"verify"==e.message?document.getElementById("TB_ajaxContent").innerHTML="<strong>"+theChampEmailPopupVerifyMessage+"</strong>":0==e.status&&(document.getElementById("the_champ_error").innerHTML=e.message,jQuery("#TB_ajaxContent").css("height","auto"))},error:function(e,t,a){location.href=decodeURIComponent(theChampRedirectionUrl)}})}function theChampCapitaliseFirstLetter2(e){return e.charAt(0).toUpperCase()+e.slice(1)}if(void 0===theChampLinkingRedirection)var theChampLinkingRedirection="";theChampVerified&&theChampLoadEvent(function(){tb_show(theChampPopupTitle,theChampAjaxUrl)}),theChampEmailPopup&&theChampLoadEvent(function(){tb_show(theChampEmailPopupTitle,theChampEmailAjaxUrl)});var theChampCommentFormLogin=!1;theChampLoadEvent(function(){null!=theChampGetCookie("heateorSsSLOptin")&&jQuery("input.heateor_ss_social_login_optin").prop("checked",!0)}),jQuery("input.heateor_ss_social_login_optin").click(function(){if(jQuery(this).is(":checked")){if(null==theChampGetCookie("heateorSsSLOptin")){var e=new Date;e.setTime(e.getTime()+31536e6),document.cookie="heateorSsSLOptin=1; expires="+e.toUTCString()+"; path=/"}}else document.cookie="heateorSsSLOptin=; expires=Fri, 02 Jan 1970 00:00:00 UTC; path=/"});
1
+ function theChampLoginPopup(e){if("undefined"!=typeof theChampSameTabLogin&&theChampSameTabLogin==1){location.href=e}else{window.open(e,"_blank","height=520,width=770,left=315,top=80,resizable,scrollbars,toolbar=0,personalbar=0,menubar=no,location=no,directories=no,status")}}function theChampLoadingIcon(){jQuery(".the_champ_login_container").html('<img id="the_champ_loading_image" src="'+theChampLoadingImgPath+'" />')}function theChampInitiateLogin(e){var t=jQuery(e).parents("div.the_champ_login_container").find(".heateor_ss_social_login_optin");if(0==t.length||jQuery(t).is(":checked")){var a=e.getAttribute("alt");"Login with Facebook"==a?theChampLoginPopup(theChampFacebookAuthUrl):"Login with Steam"==a?theChampLoginPopup(theChampSteamAuthUrl):"Login with Twitter"==a?theChampLoginPopup(theChampTwitterAuthUrl):("Login with Linkedin"==a&&theChampLoginPopup(theChampLinkedinAuthUrl),"Login with Google"==a?theChampLoginPopup(theChampGoogleAuthUrl):"Login with Vkontakte"==a?theChampLoginPopup(theChampVkontakteAuthUrl):"Login with Instagram"==a&&theChampInitializeInstaLogin())}else t.length>0&&jQuery(t).parent().css("color","red")}function theChampDisplayLoginIcon(e,t){if("undefined"!=typeof jQuery)for(var a=0;a<t.length;a++)jQuery("."+t[a]).css("display","block");else for(a=0;a<t.length;a++)for(var h=theChampGetElementsByClass(e,t[a]),i=0;i<h.length;i++)h[i].style.display="block"}function theChampValidateEmail(e){return/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)}function the_champ_save_email(e){var t=document.getElementById("the_champ_email").value.trim(),a=document.getElementById("the_champ_confirm_email").value.trim();return"save"!=e.id||theChampValidateEmail(t)?t!=a?(document.getElementById("the_champ_error").innerHTML="Email addresses do not match",void jQuery("#TB_ajaxContent").css("height","auto")):void theChampCallAjax(function(){theChampSaveEmail(e.id,t)}):(document.getElementById("the_champ_error").innerHTML=theChampEmailPopupErrorMsg,void jQuery("#TB_ajaxContent").css("height","auto"))}function theChampSaveEmail(e,t){document.getElementById("the_champ_error").innerHTML='<img src="'+theChampLoadingImgPath+'" />',jQuery.ajax({type:"POST",dataType:"json",url:theChampAjaxUrl,data:{action:"the_champ_save_email",elemId:e,email:t,id:theChampEmailPopupUniqueId},success:function(e){window.history.pushState({html:"html",pageTitle:"page title"},"","?done=1"),1==e.status&&e.message.response&&"success"==e.message.response?location.href=e.message.url:1==e.status&&"success"==e.message?location.href=theChampRegRedirectionUrl:1==e.status&&"cancelled"==e.message?tb_remove():1==e.status&&"verify"==e.message?document.getElementById("TB_ajaxContent").innerHTML="<strong>"+theChampEmailPopupVerifyMessage+"</strong>":0==e.status&&(document.getElementById("the_champ_error").innerHTML=e.message,jQuery("#TB_ajaxContent").css("height","auto"))},error:function(e,t,a){location.href=decodeURIComponent(theChampRedirectionUrl)}})}function theChampCapitaliseFirstLetter2(e){return e.charAt(0).toUpperCase()+e.slice(1)}if(void 0===theChampLinkingRedirection)var theChampLinkingRedirection="";theChampVerified&&theChampLoadEvent(function(){tb_show(theChampPopupTitle,theChampAjaxUrl)}),theChampEmailPopup&&theChampLoadEvent(function(){tb_show(theChampEmailPopupTitle,theChampEmailAjaxUrl)});var theChampCommentFormLogin=!1;theChampLoadEvent(function(){null!=theChampGetCookie("heateorSsSLOptin")&&jQuery("input.heateor_ss_social_login_optin").prop("checked",!0)}),jQuery("input.heateor_ss_social_login_optin").click(function(){if(jQuery(this).is(":checked")){if(null==theChampGetCookie("heateorSsSLOptin")){var e=new Date;e.setTime(e.getTime()+31536e6),document.cookie="heateorSsSLOptin=1; expires="+e.toUTCString()+"; path=/"}}else document.cookie="heateorSsSLOptin=; expires=Fri, 02 Jan 1970 00:00:00 UTC; path=/"});
js/front/social_login/general.js CHANGED
@@ -1,2 +1,2 @@
1
  function theChampPopup(e){window.open(e,"_blank","height=520,width=770,left=315,top=80,resizable,scrollbars,toolbar=0,personalbar=0,menubar=no,location=no,directories=no,status")}function theChampStrReplace(e,t,n){for(var r=0;r<e.length;r++){n=n.replace(new RegExp(e[r],"g"),t[r])}return n}function theChampCallAjax(e){if(typeof jQuery!="undefined"){e()}else{theChampGetScript("https://code.jquery.com/jquery-latest.min.js",e)}}function theChampGetScript(e,t){var n=document.createElement("script");n.src=e;var r=document.getElementsByTagName("head")[0],i=false;n.onload=n.onreadystatechange=function(){if(!i&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){i=true;t();n.onload=n.onreadystatechange=null;r.removeChild(n)}};r.appendChild(n)}function theChampGetElementsByClass(e,t){if(e.getElementsByClassName){return e.getElementsByClassName(t)}else{return function(e,t){if(t==null){t=document}var n=[],r=t.getElementsByTagName("*"),i=r.length,s=new RegExp("(^|\\s)"+e+"(\\s|$)"),o,u;for(o=0,u=0;o<i;o++){if(s.test(r[o].className)){n[u]=r[o];u++}}return n}(t,e)}}if(typeof String.prototype.trim!=="function"){String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}}
2
- function heateorSsLJLoginPopup(){var a=document.createElement("div");a.innerHTML='<button id="heateor_ss_lj_popup_close" class="close-button separated"><img src="'+theChampCloseIconPath+'" /></button><div id="the_champ_sharing_more_content"><div class="all-services" style="padding:20px 10px 0px 10px;height:auto;"><fieldset id="ss_openid"><legend>LiveJournal Login</legend><form action="'+theChampLJAuthUrl+'" method="post" onsubmit="this.login.disabled=true;"><input type="hidden" name="openid_action" value="SuperSocializerLogin"><div style="clear:both">'+theChampLJLoginUsernameString+'</div><div style="clear:both"><input type="text" name="openid_url" required class="openid_login"><input type="submit" name="login" value="Login"></div></form></fieldset></div></div></div>',a.setAttribute("id","the_champ_sharing_more_providers"),a.setAttribute("style","height:auto;");var b=document.createElement("div");b.setAttribute("id","heateor_ss_lj_popup_bg"),jQuery("body").append(a).append(b),document.getElementById("heateor_ss_lj_popup_bg").onclick=document.getElementById("heateor_ss_lj_popup_close").onclick=function(){a.parentNode.removeChild(a),b.parentNode.removeChild(b)}}function theChampGetCookie(e){for(var t=e+"=",a=document.cookie.split(";"),h=0;h<a.length;h++){for(var i=a[h];" "==i.charAt(0);)i=i.substring(1,i.length);if(0==i.indexOf(t))return i.substring(t.length,i.length)}return null}
1
  function theChampPopup(e){window.open(e,"_blank","height=520,width=770,left=315,top=80,resizable,scrollbars,toolbar=0,personalbar=0,menubar=no,location=no,directories=no,status")}function theChampStrReplace(e,t,n){for(var r=0;r<e.length;r++){n=n.replace(new RegExp(e[r],"g"),t[r])}return n}function theChampCallAjax(e){if(typeof jQuery!="undefined"){e()}else{theChampGetScript("https://code.jquery.com/jquery-latest.min.js",e)}}function theChampGetScript(e,t){var n=document.createElement("script");n.src=e;var r=document.getElementsByTagName("head")[0],i=false;n.onload=n.onreadystatechange=function(){if(!i&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){i=true;t();n.onload=n.onreadystatechange=null;r.removeChild(n)}};r.appendChild(n)}function theChampGetElementsByClass(e,t){if(e.getElementsByClassName){return e.getElementsByClassName(t)}else{return function(e,t){if(t==null){t=document}var n=[],r=t.getElementsByTagName("*"),i=r.length,s=new RegExp("(^|\\s)"+e+"(\\s|$)"),o,u;for(o=0,u=0;o<i;o++){if(s.test(r[o].className)){n[u]=r[o];u++}}return n}(t,e)}}if(typeof String.prototype.trim!=="function"){String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}}
2
+ function theChampGetCookie(e){for(var t=e+"=",a=document.cookie.split(";"),h=0;h<a.length;h++){for(var i=a[h];" "==i.charAt(0);)i=i.substring(1,i.length);if(0==i.indexOf(t))return i.substring(t.length,i.length)}return null}
library/Facebook/Exceptions/FacebookResponseException.php CHANGED
@@ -90,11 +90,20 @@ class FacebookResponseException extends FacebookSDKException
90
  // Video upload resumable error
91
  case 1363030:
92
  case 1363019:
93
- case 1363037:
94
  case 1363033:
95
  case 1363021:
96
  case 1363041:
97
  return new static($response, new FacebookResumableUploadException($message, $code));
 
 
 
 
 
 
 
 
 
 
98
  }
99
  }
100
 
90
  // Video upload resumable error
91
  case 1363030:
92
  case 1363019:
 
93
  case 1363033:
94
  case 1363021:
95
  case 1363041:
96
  return new static($response, new FacebookResumableUploadException($message, $code));
97
+ case 1363037:
98
+ $previousException = new FacebookResumableUploadException($message, $code);
99
+
100
+ $startOffset = isset($data['error']['error_data']['start_offset']) ? (int) $data['error']['error_data']['start_offset'] : null;
101
+ $previousException->setStartOffset($startOffset);
102
+
103
+ $endOffset = isset($data['error']['error_data']['end_offset']) ? (int) $data['error']['error_data']['end_offset'] : null;
104
+ $previousException->setEndOffset($endOffset);
105
+
106
+ return new static($response, $previousException);
107
  }
108
  }
109
 
library/Facebook/Exceptions/FacebookResumableUploadException.php CHANGED
@@ -30,4 +30,39 @@ namespace Facebook\Exceptions;
30
  */
31
  class FacebookResumableUploadException extends FacebookSDKException
32
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  }
30
  */
31
  class FacebookResumableUploadException extends FacebookSDKException
32
  {
33
+ protected $startOffset;
34
+
35
+ protected $endOffset;
36
+
37
+ /**
38
+ * @return int|null
39
+ */
40
+ public function getStartOffset()
41
+ {
42
+ return $this->startOffset;
43
+ }
44
+
45
+ /**
46
+ * @param int|null $startOffset
47
+ */
48
+ public function setStartOffset($startOffset)
49
+ {
50
+ $this->startOffset = $startOffset;
51
+ }
52
+
53
+ /**
54
+ * @return int|null
55
+ */
56
+ public function getEndOffset()
57
+ {
58
+ return $this->endOffset;
59
+ }
60
+
61
+ /**
62
+ * @param int|null $endOffset
63
+ */
64
+ public function setEndOffset($endOffset)
65
+ {
66
+ $this->endOffset = $endOffset;
67
+ }
68
  }
library/Facebook/Facebook.php CHANGED
@@ -53,7 +53,7 @@ class Facebook
53
  /**
54
  * @const string Version number of the Facebook PHP SDK.
55
  */
56
- const VERSION = '5.6.3';
57
 
58
  /**
59
  * @const string Default Graph API version for requests.
53
  /**
54
  * @const string Version number of the Facebook PHP SDK.
55
  */
56
+ const VERSION = '5.7.0';
57
 
58
  /**
59
  * @const string Default Graph API version for requests.
library/Facebook/FileUpload/FacebookResumableUploader.php CHANGED
@@ -121,6 +121,16 @@ class FacebookResumableUploader
121
  throw $e;
122
  }
123
 
 
 
 
 
 
 
 
 
 
 
124
  // Return the same chunk entity so it can be retried.
125
  return $chunk;
126
  }
121
  throw $e;
122
  }
123
 
124
+ if (null !== $preException->getStartOffset() && null !== $preException->getEndOffset()) {
125
+ return new FacebookTransferChunk(
126
+ $chunk->getFile(),
127
+ $chunk->getUploadSessionId(),
128
+ $chunk->getVideoId(),
129
+ $preException->getStartOffset(),
130
+ $preException->getEndOffset()
131
+ );
132
+ }
133
+
134
  // Return the same chunk entity so it can be retried.
135
  return $chunk;
136
  }
library/Facebook/FileUpload/FacebookTransferChunk.php CHANGED
@@ -121,6 +121,14 @@ class FacebookTransferChunk
121
  return $this->startOffset;
122
  }
123
 
 
 
 
 
 
 
 
 
124
  /**
125
  * Get uploaded video Id
126
  *
121
  return $this->startOffset;
122
  }
123
 
124
+ /**
125
+ * @return int
126
+ */
127
+ public function getEndOffset()
128
+ {
129
+ return $this->endOffset;
130
+ }
131
+
132
  /**
133
  * Get uploaded video Id
134
  *
library/Facebook/GraphNodes/GraphNodeFactory.php CHANGED
@@ -304,7 +304,9 @@ class GraphNodeFactory
304
  return $this->safelyMakeGraphEdge($data, $subclassName, $parentKey, $parentNodeId);
305
  }
306
  // Sometimes Graph is a weirdo and returns a GraphNode under the "data" key
307
- $data = $data['data'];
 
 
308
  }
309
 
310
  // Create GraphNode
304
  return $this->safelyMakeGraphEdge($data, $subclassName, $parentKey, $parentNodeId);
305
  }
306
  // Sometimes Graph is a weirdo and returns a GraphNode under the "data" key
307
+ $outerData = $data;
308
+ unset($outerData['data']);
309
+ $data = $data['data'] + $outerData;
310
  }
311
 
312
  // Create GraphNode
library/Facebook/Helpers/FacebookRedirectLoginHelper.php CHANGED
@@ -222,8 +222,8 @@ class FacebookRedirectLoginHelper
222
  $this->resetCsrf();
223
 
224
  $redirectUrl = $redirectUrl ?: $this->urlDetectionHandler->getCurrentUrl();
225
- // At minimum we need to remove the 'state' and 'code' params
226
- $redirectUrl = FacebookUrlManipulator::removeParamsFromUrl($redirectUrl, ['code', 'state']);
227
 
228
  return $this->oAuth2Client->getAccessTokenFromCode($code, $redirectUrl);
229
  }
222
  $this->resetCsrf();
223
 
224
  $redirectUrl = $redirectUrl ?: $this->urlDetectionHandler->getCurrentUrl();
225
+ // At minimum we need to remove the 'code', 'enforce_https' and 'state' params
226
+ $redirectUrl = FacebookUrlManipulator::removeParamsFromUrl($redirectUrl, ['code', 'enforce_https', 'state']);
227
 
228
  return $this->oAuth2Client->getAccessTokenFromCode($code, $redirectUrl);
229
  }
library/Facebook/Http/GraphRawResponse.php CHANGED
@@ -104,8 +104,9 @@ class GraphRawResponse
104
  */
105
  public function setHttpResponseCodeFromHeader($rawResponseHeader)
106
  {
107
- preg_match('|HTTP/\d\.\d\s+(\d+)\s+.*|', $rawResponseHeader, $match);
108
- $this->httpResponseCode = (int)$match[1];
 
109
  }
110
 
111
  /**
104
  */
105
  public function setHttpResponseCodeFromHeader($rawResponseHeader)
106
  {
107
+ // https://tools.ietf.org/html/rfc7230#section-3.1.2
108
+ list($version, $status, $reason) = array_pad(explode(' ', $rawResponseHeader, 3), 3, null);
109
+ $this->httpResponseCode = (int) $status;
110
  }
111
 
112
  /**
library/LiveJournalLogin/class.openid.v3.php DELETED
@@ -1,272 +0,0 @@
1
- <?php
2
- /*
3
- FREE TO USE
4
- Under License: GPLv3
5
- Simple OpenID PHP Class
6
-
7
- Some modifications by Eddie Roosenmaallen, eddie@roosenmaallen.com
8
- -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
9
- */
10
- if (!class_exists('SimpleOpenID')) {
11
- class SimpleOpenID{
12
- var $openid_url_identity;
13
- var $URLs = array();
14
- var $error = array();
15
- var $fields = array(
16
- 'required' => array(),
17
- 'optional' => array(),
18
- );
19
-
20
- public function __construct(){
21
- if (!function_exists('curl_exec')) {
22
- die('Error: Class SimpleOpenID requires curl extension to work');
23
- }
24
- }
25
- public function SetOpenIDServer($a){
26
- $this->URLs['openid_server'] = $a;
27
- }
28
- public function SetTrustRoot($a){
29
- $this->URLs['trust_root'] = $a;
30
- }
31
- public function SetCancelURL($a){
32
- $this->URLs['cancel'] = $a;
33
- }
34
- public function SetApprovedURL($a){
35
- $this->URLs['approved'] = $a;
36
- }
37
- public function SetRequiredFields($a){
38
- if (is_array($a)){
39
- $this->fields['required'] = $a;
40
- }else{
41
- $this->fields['required'][] = $a;
42
- }
43
- }
44
- public function SetOptionalFields($a){
45
- if (is_array($a)){
46
- $this->fields['optional'] = $a;
47
- }else{
48
- $this->fields['optional'][] = $a;
49
- }
50
- }
51
- public function SetIdentity($a){ // Set Identity URL
52
- if ((stripos($a, 'http://') === false)
53
- && (stripos($a, 'https://') === false)){
54
- $a = 'http://'.$a;
55
- }
56
- /*
57
- $u = parse_url(trim($a));
58
- if (!isset($u['path'])){
59
- $u['path'] = '/';
60
- }else if(substr($u['path'],-1,1) == '/'){
61
- $u['path'] = substr($u['path'], 0, strlen($u['path'])-1);
62
- }
63
- if (isset($u['query'])){ // If there is a query string, then use identity as is
64
- $identity = $a;
65
- }else{
66
- $identity = $u['scheme'] . '://' . $u['host'] . $u['path'];
67
- }
68
- //*/
69
- $this->openid_url_identity = $a;
70
- }
71
- public function GetIdentity(){ // Get Identity
72
- return $this->openid_url_identity;
73
- }
74
- public function GetError(){
75
- $e = $this->error;
76
- return array('code'=>$e[0],'description'=>$e[1]);
77
- }
78
-
79
- public function ErrorStore($code, $desc = null){
80
- $errs['OPENID_NOSERVERSFOUND'] = 'Cannot find OpenID Server TAG on Identity page.';
81
- if ($desc == null){
82
- $desc = $errs[$code];
83
- }
84
- $this->error = array($code,$desc);
85
- }
86
-
87
- public function IsError(){
88
- if (count($this->error) > 0){
89
- return true;
90
- }else{
91
- return false;
92
- }
93
- }
94
-
95
- public function splitResponse($response) {
96
- $r = array();
97
- $response = explode("\n", $response);
98
- foreach($response as $line) {
99
- $line = trim($line);
100
- if ($line != "") {
101
- list($key, $value) = explode(":", $line, 2);
102
- $r[trim($key)] = trim($value);
103
- }
104
- }
105
- return $r;
106
- }
107
-
108
- public function OpenID_Standarize($openid_identity = null){
109
- if ($openid_identity === null)
110
- $openid_identity = $this->openid_url_identity;
111
-
112
- $u = parse_url(strtolower(trim($openid_identity)));
113
-
114
- if (!isset($u['path']) || ($u['path'] == '/')) {
115
- $u['path'] = '';
116
- }
117
- if(substr($u['path'],-1,1) == '/'){
118
- $u['path'] = substr($u['path'], 0, strlen($u['path'])-1);
119
- }
120
- if (isset($u['query'])){ // If there is a query string, then use identity as is
121
- return $u['host'] . $u['path'] . '?' . $u['query'];
122
- }else{
123
- return $u['host'] . $u['path'];
124
- }
125
- }
126
-
127
- public function array2url($arr){ // converts associated array to URL Query String
128
- if (!is_array($arr)){
129
- return false;
130
- }
131
- $query = '';
132
- foreach($arr as $key => $value){
133
- $query .= $key . "=" . $value . "&";
134
- }
135
- return $query;
136
- }
137
- public function FSOCK_Request($url, $method="GET", $params = ""){
138
- $fp = fsockopen("ssl://www.myopenid.com", 443, $errno, $errstr, 3); // Connection timeout is 3 seconds
139
- if (!$fp) {
140
- $this->ErrorStore('OPENID_SOCKETERROR', $errstr);
141
- return false;
142
- } else {
143
- $request = $method . " /server HTTP/1.0\r\n";
144
- $request .= "User-Agent: Simple OpenID PHP Class (http://www.phpclasses.org/simple_openid)\r\n";
145
- $request .= "Connection: close\r\n\r\n";
146
- fwrite($fp, $request);
147
- stream_set_timeout($fp, 4); // Connection response timeout is 4 seconds
148
- $res = fread($fp, 2000);
149
- $info = stream_get_meta_data($fp);
150
- fclose($fp);
151
-
152
- if ($info['timed_out']) {
153
- $this->ErrorStore('OPENID_SOCKETTIMEOUT');
154
- } else {
155
- return $res;
156
- }
157
- }
158
- }
159
- public function CURL_Request($url, $method="GET", $params = "") { // Remember, SSL MUST BE SUPPORTED
160
- if (is_array($params)) $params = $this->array2url($params);
161
- $curl = curl_init($url . ($method == "GET" && $params != "" ? "?" . $params : ""));
162
- curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
163
- curl_setopt($curl, CURLOPT_HEADER, false);
164
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
165
- curl_setopt($curl, CURLOPT_HTTPGET, ($method == "GET"));
166
- curl_setopt($curl, CURLOPT_POST, ($method == "POST"));
167
- if ($method == "POST") curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
168
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
169
- $response = curl_exec($curl);
170
-
171
- if (curl_errno($curl) == 0){
172
- $response;
173
- }else{
174
- $this->ErrorStore('OPENID_CURL', curl_error($curl));
175
- }
176
- return $response;
177
- }
178
-
179
- public function HTML2OpenIDServer($content) {
180
- $get = array();
181
-
182
- // Get details of their OpenID server and (optional) delegate
183
- preg_match_all('/<link[^>]*rel=[\'"]openid.server[\'"][^>]*href=[\'"]([^\'"]+)[\'"][^>]*\/?>/i', $content, $matches1);
184
- preg_match_all('/<link[^>]*href=\'"([^\'"]+)[\'"][^>]*rel=[\'"]openid.server[\'"][^>]*\/?>/i', $content, $matches2);
185
- $servers = array_merge($matches1[1], $matches2[1]);
186
-
187
- preg_match_all('/<link[^>]*rel=[\'"]openid.delegate[\'"][^>]*href=[\'"]([^\'"]+)[\'"][^>]*\/?>/i', $content, $matches1);
188
-
189
- preg_match_all('/<link[^>]*href=[\'"]([^\'"]+)[\'"][^>]*rel=[\'"]openid.delegate[\'"][^>]*\/?>/i', $content, $matches2);
190
-
191
- $delegates = array_merge($matches1[1], $matches2[1]);
192
-
193
- $ret = array($servers, $delegates);
194
- return $ret;
195
- }
196
-
197
- public function GetOpenIDServer(){
198
- $response = $this->CURL_Request($this->openid_url_identity);
199
- list($servers, $delegates) = $this->HTML2OpenIDServer($response);
200
- if (count($servers) == 0){
201
- $this->ErrorStore('OPENID_NOSERVERSFOUND');
202
- return false;
203
- }
204
- if (isset($delegates[0])
205
- && ($delegates[0] != "")){
206
- $this->SetIdentity($delegates[0]);
207
- }
208
- $this->SetOpenIDServer($servers[0]);
209
- return $servers[0];
210
- }
211
-
212
- public function GetRedirectURL(){
213
- $params = array();
214
- $params['openid.return_to'] = urlencode($this->URLs['approved']);
215
- $params['openid.mode'] = 'checkid_setup';
216
- $params['openid.identity'] = urlencode($this->openid_url_identity);
217
- $params['openid.trust_root'] = urlencode($this->URLs['trust_root']);
218
-
219
- if (isset($this->fields['required'])
220
- && (count($this->fields['required']) > 0)) {
221
- $params['openid.sreg.required'] = implode(',',$this->fields['required']);
222
- }
223
- if (isset($this->fields['optional'])
224
- && (count($this->fields['optional']) > 0)) {
225
- $params['openid.sreg.optional'] = implode(',',$this->fields['optional']);
226
- }
227
- return $this->URLs['openid_server'] . "?". $this->array2url($params);
228
- }
229
-
230
- public function Redirect(){
231
- $redirect_to = $this->GetRedirectURL();
232
- if (headers_sent()){ // Use JavaScript to redirect if content has been previously sent (not recommended, but safe)
233
- echo '<script language="JavaScript" type="text/javascript">window.location=\'';
234
- echo $redirect_to;
235
- echo '\';</script>';
236
- }else{ // Default Header Redirect
237
- header('Location: ' . $redirect_to);
238
- }
239
- }
240
-
241
- public function ValidateWithServer(){
242
- $params = array(
243
- 'openid.assoc_handle' => urlencode($_GET['openid_assoc_handle']),
244
- 'openid.signed' => urlencode($_GET['openid_signed']),
245
- 'openid.sig' => urlencode($_GET['openid_sig'])
246
- );
247
- // Send only required parameters to confirm validity
248
- $arr_signed = explode(",",str_replace('sreg.','sreg_',$_GET['openid_signed']));
249
- for ($i=0; $i<count($arr_signed); $i++){
250
- $s = str_replace('sreg_','sreg.', $arr_signed[$i]);
251
- $c = $_GET['openid_' . $arr_signed[$i]];
252
- // if ($c != ""){
253
- $params['openid.' . $s] = urlencode($c);
254
- // }
255
- }
256
- $params['openid.mode'] = "check_authentication";
257
-
258
- $openid_server = $this->GetOpenIDServer();
259
- if ($openid_server == false){
260
- return false;
261
- }
262
- $response = $this->CURL_Request($openid_server,'POST',$params);
263
- $data = $this->splitResponse($response);
264
-
265
- if ($data['is_valid'] == "true") {
266
- return true;
267
- }else{
268
- return false;
269
- }
270
- }
271
- }
272
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
library/LiveJournalLogin/index.php DELETED
@@ -1 +0,0 @@
1
- <?php die("Silence is Golden"); ?>
 
library/Twitch/index.php DELETED
@@ -1 +0,0 @@
1
- <?php die("Silence is Golden"); ?>
 
library/Twitch/twitch.php DELETED
@@ -1,676 +0,0 @@
1
- <?php
2
- /*
3
- * TwitchTV API code by Elias Ranz-Schleifer
4
- * Thank you for using my code please refer to
5
- * https://github.com/Xxplosions/twitchtv-oauth for future updates
6
- * Have questions or feedback? Contact Elias on Twitter (https://twitter.com/xxplosions)
7
- * Check out my livestream at http://twitch.tv/xxplosions (It would be amazing to chat with you about future updates)
8
- */
9
-
10
- class TwitchTV {
11
- var $base_url = "https://api.twitch.tv/kraken/";
12
- var $client_id = '';
13
- var $client_secret = '';
14
- var $redirect_url = '';
15
- var $scope_array = array();
16
-
17
- /**
18
- * Channel data for the fetched user
19
- *
20
- * @var stdClass
21
- */
22
- var $channel_data = null;
23
- var $curl_cache;
24
-
25
- public function __construct($client_id, $client_secret, $redirect_url, $scope_array) {
26
- $this->client_id = $client_id;
27
- $this->client_secret = $client_secret;
28
- $this->redirect_url = $redirect_url;
29
- $this->scope_array = $scope_array;
30
-
31
- $this->curl_cache = new TwitchTV_Curl_Cache();
32
- }
33
-
34
- /**
35
- * Generates a link based on the desired scope
36
- *
37
- * @return string URL that is used to gain permissions for TwitchTV Authentication
38
- */
39
- public function authenticate() {
40
- $i = 0;
41
- $return = '';
42
- $len = count($this->scope_array);
43
- //search through the scope array and append a + foreach all but the last element
44
- foreach ($this->scope_array as $scope) {
45
- if ($i == $len - 1) {
46
- $scope .= "";
47
- $return .= $scope;
48
- } else {
49
- $scope .= "+";
50
- $return .= $scope;
51
- }
52
-
53
- $i++;
54
- }
55
- //initiate connection to the twitch.tv servers
56
- $scope = $return;
57
- $authenticate_url = $this->base_url . 'oauth2/authorize?response_type=code&client_id=' . $this->client_id . '&redirect_uri=' . $this->redirect_url . '&scope=' . $scope;
58
- return $authenticate_url;
59
- }
60
-
61
- /**
62
- * Get's the access token for a specific user based on the code passed back from Twitch after Authenticating the application.
63
- *
64
- * @param string $code
65
- * @return string Access token that is required by Twitch to make authenticated responses on behalf of the user
66
- */
67
- public function get_access_token($code) {
68
- $ch = curl_init($this->base_url . "oauth2/token");
69
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
70
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
71
- curl_setopt($ch, CURLOPT_POST, 1);
72
- $fields = array(
73
- 'client_id' => $this->client_id,
74
- 'client_secret' => $this->client_secret,
75
- 'grant_type' => 'authorization_code',
76
- 'redirect_uri' => $this->redirect_url,
77
- 'code' => $code
78
- );
79
- curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
80
- $data = curl_exec($ch);
81
- $response = json_decode($data, true);
82
- return $response["access_token"];
83
- }
84
-
85
- /**
86
- * Gets the authenticated user based on an access token.
87
- * It's best to store this value in the database for future use.
88
- *
89
- * @param string $access_token
90
- * @return string Username that is
91
- */
92
- public function authenticated_user($access_token) {
93
- $ch = curl_init();
94
- curl_setopt($ch, CURLOPT_URL, $this->base_url);
95
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
96
- curl_setopt($ch, CURLOPT_HTTPHEADER, array(
97
- 'Accept: application/vnd.twitchtv.v5+json',
98
- 'Authorization: OAuth ' . $access_token
99
- ));
100
- $output = curl_exec($ch);
101
- $response = json_decode($output, true);
102
- curl_close($ch);
103
- if (isset($response['token']['error'])) {
104
- return 'Unauthorized';
105
- } else {
106
- $username = $response['token']['user_name'];
107
- return $username;
108
- }
109
- }
110
- /**
111
- * Makes sure that the stream that is passed in is an actual channel on TwitchTV.
112
- *
113
- * @param string $username
114
- * @return boolean TRUE means that the channel is valid
115
- * FALSE means that the channel is invalid
116
- */
117
-
118
- public function validate_stream($username) {
119
- $userid = $this->get_userid($username);
120
- $curl = curl_init();
121
- curl_setopt_array($curl, array(
122
- CURLOPT_RETURNTRANSFER => 1,
123
- CURLOPT_URL => $this->base_url . 'users/' . $userid . '?client_id=' . $this->client_id . '&api_version=5'
124
- ));
125
-
126
- $result = curl_exec($curl);
127
- //makes sure that the cURL was excuted if not it generates the error stating that it didn't succeed.
128
- if (!$result) {
129
- die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
130
- } else {
131
- $decoded = json_decode($result);
132
- if (isset($decoded->error)) {
133
- return false;
134
- } else {
135
- return true;
136
- }
137
- print_r($decoded);
138
- }
139
- }
140
-
141
- /**
142
- * Loads a channel and its data
143
- *
144
- * @param string $channel
145
- * @return array Array of data that includes the display name, Status, Chat links, game that the stream is playing and the banner
146
- */
147
- public function load_channel($channel) {
148
- $channelid = $this->get_userid($channel);
149
- //initiate connection to the twitch.tv servers
150
- $curl = curl_init();
151
- curl_setopt_array($curl, array(
152
- CURLOPT_RETURNTRANSFER => 1,
153
- CURLOPT_URL => $this->base_url . 'channels/' . $channelid . '?client_id=' . $this->client_id . '&api_version=5'
154
- ));
155
- $result = curl_exec($curl);
156
- //makes sure that the cURL was excuted if not it generates the error stating that it didn't succeed.
157
- if (!$result) {
158
- die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
159
- } else {
160
- //cURL Response worked
161
- if (!empty($channel)) {
162
- $return = json_decode($result);
163
- $stream_details = array(
164
- 'display_name' => $return->display_name,
165
- 'status' => $return->status,
166
- 'chat' => $return->_links->chat,
167
- 'game' => $return->game,
168
- 'banner' => $return->banner
169
- );
170
- return $stream_details;
171
- }
172
- }
173
- curl_close($curl);
174
- }
175
-
176
- /**
177
- * Loads a username and its data
178
- *
179
- * @param string $username
180
- * @param string $profile_data
181
- * @return array Array of data that includes the display name, Status, Chat links, game that the stream is playing and the banner
182
- */
183
- public function get_userid($username, $profile_data = false, $access_token) {
184
- //initiate connection to the twitch.tv servers
185
- $curl = curl_init('https://api.twitch.tv/kraken/user');
186
- curl_setopt($curl, CURLOPT_HTTPHEADER, array(
187
- 'Accept: application/vnd.twitchtv.v5+json',
188
- 'Authorization: OAuth ' . $access_token,
189
- 'Client-ID: ' . $this->client_id
190
- ));
191
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
192
- $result = curl_exec($curl);
193
- //makes sure that the cURL was excuted if not it generates the error stating that it didn't succeed.
194
- if (!$result) {
195
- die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
196
- } else {
197
- //cURL Response worked
198
- if (!empty($username)) {
199
- $return = json_decode($result, true);
200
- if ($profile_data) {
201
- return $return;
202
- }else{
203
- $user_id = $return['_id'];
204
- return $user_id;
205
- }
206
- }
207
- }
208
- curl_close($curl);
209
- }
210
-
211
- /**
212
- * Loads the offline image for a given broadcaster display this if the channel is offline.
213
- *
214
- * @param string $channel
215
- * @return string URL of the image that is given back by the Twitch. Uses a protocoless url on the front end
216
- */
217
- public function load_channel_offline_img($channel) {
218
- $channelid = $this->get_userid($channel);
219
- //initiate connection to the twitch.tv servers
220
- $curl = curl_init();
221
- curl_setopt_array($curl, array(
222
- CURLOPT_RETURNTRANSFER => 1,
223
- CURLOPT_URL => $this->base_url . 'channels/' . $channelid . '?client_id=' . $this->client_id . '&api_version=5'
224
- ));
225
- $result = curl_exec($curl);
226
- //makes sure that the cURL was excuted if not it generates the error stating that it didn't succeed.
227
- if (!curl_exec($curl)) {
228
- die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
229
- } else {
230
- //cURL Response worked
231
- if (!empty($channel)) {
232
- $return = json_decode($result);
233
-
234
- $offline_img = $return->video_banner;
235
-
236
-
237
- return str_replace("http:", "", $offline_img);
238
- }
239
- }
240
- curl_close($curl);
241
-
242
- }
243
-
244
- /**
245
- * Grabs the video image that appears on the watch page if a stream is live.
246
- *
247
- * @param string $channel
248
- * @return string URL of the image that is given back by the Twitch. Uses a protocoless url on the front end
249
- */
250
- public function load_channel_video_img($channel) {
251
- $channelid = $this->get_userid($channel);
252
- //initiate connection to the twitch.tv servers
253
- $curl = curl_init();
254
- curl_setopt_array($curl, array(
255
- CURLOPT_RETURNTRANSFER => 1,
256
- CURLOPT_URL => $this->base_url . 'streams/' . $channelid . '?client_id=' . $this->client_id . '&api_version=5'
257
- ));
258
- $result = curl_exec($curl);
259
- //makes sure that the cURL was excuted if not it generates the error stating that it didn't succeed.
260
- if (!curl_exec($curl)) {
261
- die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
262
- } else {
263
- //cURL Response worked
264
- if (!empty($channel)) {
265
- $return = json_decode($result);
266
-
267
-
268
- $preview = $return->stream->preview->medium;
269
-
270
- return str_replace("http:", "", $preview);
271
-
272
- }
273
- }
274
- curl_close($curl);
275
-
276
- }
277
-
278
- /**
279
- * Grabs the data for a given broadcast
280
- *
281
- * @param string $channel
282
- * @return array
283
- */
284
- public function get_broadcast_data($username) {
285
- return !empty($this->channel_data) ? $this->channel_data : $this->retrieve_channel_data($username);
286
- }
287
-
288
- /**
289
- * Grabs the stream title for a given stream
290
- *
291
- * @param string $username
292
- * @return string
293
- */
294
- public function get_stream_title($username) {
295
- return $this->get_broadcast_data($username)->status;
296
- }
297
-
298
- public function update_stream_title($access_token, $title = null, $game = null) {
299
- $username = $this->authenticated_user($access_token);
300
- $userid = $this->get_userid($username);
301
- if ($username != 'Unauthorized') {
302
- //get channel data so that you can make sure a value is being passed in and not setting it as an empty request
303
- $channel_data = json_decode(file_get_contents($this->base_url . 'channels/' . $userid));
304
- //no game? set it to the value that is stored in the API
305
- if ($game == null) {
306
- $game = $channel_data->game;
307
- }
308
- //no title? set it to the value in the API
309
- if ($title == null) {
310
- $title = $channel_data->status;
311
- }
312
-
313
- // make the API call and update stream information
314
- $ch = curl_init();
315
- curl_setopt($ch, CURLOPT_URL, $this->base_url . "channels/" . $userid);
316
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
317
- curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
318
- curl_setopt($ch, CURLOPT_POST, 1);
319
- $fields = array(
320
- 'channel[status]' => $title,
321
- 'channel[game]' => $game
322
- );
323
- curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
324
- curl_setopt($ch, CURLOPT_HTTPHEADER, array(
325
- 'Authorization: OAuth ' . $access_token
326
- ));
327
- $output = curl_exec($ch);
328
- $response = json_decode($output, true);
329
- curl_close($ch);
330
-
331
- return true;
332
- }
333
- }
334
-
335
- /**
336
- * Grabs the viewer count of a given stream
337
- *
338
- * @param string $channel
339
- * @return array
340
- */
341
- public function load_stream_stats($channel) {
342
- $channelid = $this->get_userid($channel);
343
- //initiate connection to the twitch.tv servers
344
- $result = $this->curl_cache->get_data('streams');
345
- if (!$result) {
346
- $curl = curl_init();
347
-
348
- curl_setopt_array($curl, array(
349
- CURLOPT_RETURNTRANSFER => 1,
350
- CURLOPT_URL => $this->base_url . 'streams/' . $channelid . '?client_id=' . $this->client_id . '&api_version=5'
351
- ));
352
- $result = curl_exec($curl);
353
- }
354
-
355
- //makes sure that the cURL was excuted if not it generates the error stating that it didn't succeed.
356
- if (!$result) {
357
- die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
358
- } else {
359
- //cURL Response worked
360
- if (!empty($channel)) {
361
- $return = json_decode($result);
362
-
363
- // Cache data is only useful if we actually got something back
364
- $this->curl_cache->set_data('streams', $result);
365
-
366
- if ($return->stream == null) {
367
- return;
368
- } else {
369
- $stream_details = array(
370
- 'viewers' => $return->stream->viewers
371
- );
372
- return $stream_details;
373
- }
374
- }
375
- }
376
- curl_close($curl);
377
- }
378
-
379
- /**
380
- * Determins whether a stream is online or offline
381
- *
382
- * @param string $channel
383
- * @return string
384
- */
385
- public function stream_status($channel) {
386
- if ($channel) {
387
- $channelid = $this->get_userid($channel);
388
- //initiate connection to the twitch.tv servers
389
- $curl = curl_init();
390
- curl_setopt_array($curl, array(
391
- CURLOPT_RETURNTRANSFER => 1,
392
- CURLOPT_URL => $this->base_url . 'streams/' . $channelid . '?client_id=' . $this->client_id . '&api_version=5'
393
- ));
394
- $result = curl_exec($curl);
395
- //makes sure that the cURL was excuted if not it generates the error stating that it didn't succeed.
396
- if (!$result) {
397
- die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
398
- } else {
399
- //cURL Response worked
400
- if (!empty($channel)) {
401
- $return = json_decode($result);
402
- if ($return->stream == null) {
403
- $offline = "Stream Offline";
404
- return $offline;
405
- } else {
406
- $online = "Stream Online";
407
- return $online;
408
- }
409
- }
410
- }
411
- curl_close($curl);
412
- } else {
413
- return;
414
- }
415
- }
416
-
417
- /**
418
- * Grabs the total number of followers that a stream currently has
419
- *
420
- * @param string $channel
421
- * @return int
422
- */
423
- public function follower_count($channel) {
424
- $channelid = $this->get_userid($channel);
425
- //initiate connection to the twitch.tv servers
426
- $curl = curl_init();
427
- curl_setopt_array($curl, array(
428
- CURLOPT_RETURNTRANSFER => 1,
429
- CURLOPT_URL => $this->base_url . 'channels/' . $channelid . '/follows?client_id=' . $this->client_id . '&api_version=5'
430
- ));
431
- $result = curl_exec($curl);
432
- //makes sure that the cURL was excuted if not it generates the error stating that it didn't succeed.
433
- if (!$result) {
434
- die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
435
- } else {
436
- //cURL Response worked
437
- if (!empty($channel)) {
438
- $return = json_decode($result);
439
- $followers = $return->_total;
440
- return $followers;
441
- }
442
- }
443
- curl_close($curl);
444
- }
445
-
446
- /**
447
- * Determines if a stream is online or not
448
- *
449
- * @param string $channel
450
- * @return boolean
451
- */
452
- public function stream_online_status($channel) {
453
- //initiate connection to the twitch.tv servers
454
- $channelid = $this->get_userid($channel);
455
- $result = $this->curl_cache->get_data('streams');
456
- if (!$result) {
457
- $curl = curl_init();
458
- curl_setopt_array($curl, array(
459
- CURLOPT_RETURNTRANSFER => 1,
460
- CURLOPT_URL => $this->base_url . 'streams/' . $channelid . '?client_id=' . $this->client_id . '&api_version=5'
461
- ));
462
- $result = curl_exec($curl);
463
- }
464
-
465
- //makes sure that the cURL was excuted if not it generates the error stating that it didn't succeed.
466
- if (!$result) {
467
- die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
468
- } else {
469
- //cURL Response worked
470
- if (!empty($channel)) {
471
- $return = json_decode($result);
472
-
473
- $this->curl_cache->set_data('streams', $result);
474
-
475
- if ($return->stream == null) {
476
- return false;
477
- } else {
478
- return true;
479
- }
480
- }
481
- }
482
- curl_close($curl);
483
- }
484
-
485
- /**
486
- * Loads the video embed for twitch. Includes both object embed code (provided by twitch) and iframe for frameworks that don't support object players.
487
- *
488
- * @param string $channel
489
- * @param int $height
490
- * @param int $width
491
- * @return html
492
- */
493
- public function load_video($channel, $height = null, $width = null) {
494
- //defaults for stream embed dimensions, set so you can pass in the height and width outside of this function
495
- if ($height == null && $width == null) {
496
- $width = 640;
497
- $height = 360;
498
- }
499
- //make sure that a channel is passed in so that it doesn't return an invalid embed code
500
- if (!empty($channel)) {
501
- //embed code for the video thanks to twitch.tv
502
- $embed_code = '<iframe width="' . $width . '" height="' . $height . '" src="http://player.twitch.tv/?channel=' . $channel . '&auto_play=true&start_volume=25" frameborder="0" allowfullscreen="true" auto_play="true" start_volume="25"></iframe>';
503
- return $embed_code;
504
- } else {
505
- return;
506
- }
507
- }
508
-
509
- /**
510
- * Loads the chat for a given channel embed code provided by Twitch
511
- *
512
- * @param string $channel
513
- * @param int $height
514
- * @param int $width
515
- * @return html
516
- */
517
- public function load_chat($channel, $height = null, $width = null) {
518
- //defaults for stream embed dimensions, set so you can pass in the height and width outside of this function
519
- if ($height == null && $width == null) {
520
- $width = 350;
521
- $height = 500;
522
- }
523
- //make sure that a channel is passed in so that it doesn't return an invalid embed code
524
- if (!empty($channel)) {
525
- //embed code thanks to twitch.tv
526
- $embed_code = '<iframe frameborder="0" scrolling="no" id="chat_embed" src="http://twitch.tv/chat/embed?channel=' . $channel . '&amp;popout_chat=true" height="' . $height . '" width="100%"></iframe>';
527
- return $embed_code;
528
- } else {
529
- return;
530
- }
531
- }
532
-
533
- /**
534
- * Gets a complete list of games that are currrently live on Twitch for use when updating stream title can be used to populate an autocomplete.
535
- *
536
- * @return array
537
- */
538
- public function get_games() {
539
- $game = array();
540
- for ($i = 0; $i < 5; $i++) {
541
- $offset = 100 * $i;
542
- $obj = json_decode(file_get_contents('https://api.twitch.tv/kraken/games/top?limit=100&offset=' . $offset));
543
- if ($obj) {
544
- foreach ($obj->top as $top) {
545
- $game[] = $top;
546
- }
547
- }
548
- }
549
- $games = array();
550
- foreach ($game as $game) {
551
- $games[] = $game->game->name;
552
- }
553
- return json_encode($games);
554
- }
555
-
556
- /**
557
- * Sends a request to twitch to run a commercial on a given channel
558
- *
559
- * @param string $access_token
560
- * @param int $length
561
- * @return boolean
562
- */
563
- public function run_commercial($access_token, $length = 30) {
564
- $username = $this->authenticated_user($access_token);
565
- $userid = $this->get_userid($username);
566
- $ch = curl_init($this->base_url . "channels/" . $userid . '/commercial');
567
- curl_setopt($ch, CURLOPT_HTTPHEADER, array(
568
- 'Accept: application/vnd.twitchtv.v5+json',
569
- 'Authorization: OAuth ' . $access_token
570
- ));
571
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
572
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
573
- curl_setopt($ch, CURLOPT_POST, 1);
574
- $fields = array(
575
- 'client_id' => $this->client_id,
576
- 'length' => $length
577
- );
578
- curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
579
- $data = curl_exec($ch);
580
- $response = json_decode($data, true);
581
- return true;
582
- }
583
-
584
- /**
585
- * Make a request to follow a given channel
586
- *
587
- * @param string $channel
588
- * @param string $access_token
589
- * @return boolean
590
- */
591
- public function follow_channel($channel, $access_token) {
592
- $username = $this->authenticated_user($access_token);
593
- $userid = $this->get_userid($username);
594
- $channelid = $this->get_userid($channel);
595
- $ch = curl_init($this->base_url . "users/" . $userid . "/follows/channels/" . $channelid);
596
- curl_setopt($ch, CURLOPT_HTTPHEADER, array(
597
- 'Accept: application/vnd.twitchtv.v5+json',
598
- 'Authorization: OAuth ' . $access_token
599
- ));
600
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
601
- curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
602
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
603
- curl_setopt($ch, CURLOPT_POST, 1);
604
- $fields = array(
605
- 'client_id' => $this->client_id
606
- );
607
- curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
608
- $data = curl_exec($ch);
609
- return true;
610
- }
611
-
612
- /**
613
- * Retrieve the data for a specific channel used to make cached calls throughout the class
614
- *
615
- * @param string $username
616
- * @return array
617
- */
618
- private function retrieve_channel_data($username) {
619
- $userid = $this->get_userid($username);
620
- return json_decode(file_get_contents($this->base_url . 'channels/' . $userid));
621
- }
622
-
623
- }
624
-
625
-
626
- /**
627
- * A class to ensure that there aren't more calls to the API than needed
628
- * Written by Robarelli
629
- */
630
- class TwitchTV_Curl_Cache {
631
-
632
- /**
633
- * Holds the cache data
634
- */
635
- private $cache = array();
636
-
637
- /**
638
- * Retrieve the cache data
639
- *
640
- * @param string $id the cache key
641
- * @return multitype:
642
- */
643
- public function get_data($id) {
644
- return array_key_exists($id, $this->cache) ? $this->cache[$id] : null;
645
- }
646
-
647
- /**
648
- * Set the cache data
649
- *
650
- * @param string $id the cache key. Recommended to be the slug name of the url in the cURL request
651
- * @param unknown $data
652
- */
653
- public function set_data($id, $data) {
654
- return $this->cache[$id] = $data;
655
- }
656
-
657
- /**
658
- * Remove an item from the cache
659
- *
660
- * @param string $id
661
- */
662
- public function unset_data($id) {
663
- unset($this->cache[$id]);
664
- }
665
-
666
- /**
667
- * Checks if a key has been set in the cache
668
- *
669
- * @param string $id
670
- * @return boolean
671
- */
672
- public function data_exists($id) {
673
- return !empty($this->cache[$id]);
674
- }
675
- }
676
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
library/Twitter/.gitignore ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ .DS_Store
2
+ composer.lock
3
+ vendor
4
+ env
5
+ .cache
library/Twitter/.travis.yml ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ language: php
2
+ dist: bionic
3
+ php:
4
+ - '7.2'
5
+ - '7.3'
6
+ - nightly
7
+ sudo: false
8
+ before_script:
9
+ - composer self-update
10
+ - composer install --no-interaction
11
+ script: vendor/bin/phpunit
12
+ matrix:
13
+ allow_failures:
14
+ - php: nightly
15
+ include:
16
+ - name: Lint
17
+ script: vendor/bin/phpcs src tests --standard=PSR2
18
+ - name: cacert.pem current
19
+ script: tests/scripts/cacert.sh
20
+ cache:
21
+ directories:
22
+ - $HOME/.composer/cache/files
library/Twitter/CODE_OF_CONDUCT.md ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
6
+
7
+ ## Our Standards
8
+
9
+ Examples of behavior that contributes to creating a positive environment include:
10
+
11
+ * Using welcoming and inclusive language
12
+ * Being respectful of differing viewpoints and experiences
13
+ * Gracefully accepting constructive criticism
14
+ * Focusing on what is best for the community
15
+ * Showing empathy towards other community members
16
+
17
+ Examples of unacceptable behavior by participants include:
18
+
19
+ * The use of sexualized language or imagery and unwelcome sexual attention or advances
20
+ * Trolling, insulting/derogatory comments, and personal or political attacks
21
+ * Public or private harassment
22
+ * Publishing others' private information, such as a physical or electronic address, without explicit permission
23
+ * Other conduct which could reasonably be considered inappropriate in a professional setting
24
+
25
+ ## Our Responsibilities
26
+
27
+ Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
28
+
29
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
30
+
31
+ ## Scope
32
+
33
+ This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
34
+
35
+ ## Enforcement
36
+
37
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at abraham@abrah.am. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
38
+
39
+ Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
40
+
41
+ ## Attribution
42
+
43
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
44
+
45
+ [homepage]: http://contributor-covenant.org
46
+ [version]: http://contributor-covenant.org/version/1/4/
library/Twitter/CONTRIBUTING.md ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Contributing to TwitterOAuth
2
+ ====
3
+
4
+ 👏 Thanks!
5
+ ----
6
+
7
+ Thanks for your interest in contributing to TwitterOAuth. We appreciate contributions small and large.
8
+
9
+ 🌱 Grow
10
+ ----
11
+
12
+ If you have an idea for something new or would like to improve something. Please [open a quick issue](https://github.com/abraham/twitteroauth/issues/new) explaining the changes and the reasons for them. Everyone's time is important and we don't want you duplicating work someone else might already be working on.
13
+
14
+ GitHub has [outlined instructions](https://help.github.com/articles/fork-a-repo/) for forking a repo. To work on an update to this repo, you will:
15
+
16
+ - Fork the repo
17
+ - Make the changes
18
+ - Submit a pull request
19
+
20
+ Once the [pull request](https://help.github.com/articles/about-pull-requests/) is reviewed, if the changes are approved they will be merged in to the project.
21
+
22
+ 🐛 Bugs
23
+ ----
24
+
25
+ Please [open a new issue](https://github.com/abraham/twitteroauth/issues/new) and details what you are trying to do, what is happening, and what you expect to happen. Err on the side of providing more details.
library/Twitter/LICENSE.md ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2009 Abraham Williams - http://abrah.am - abraham@abrah.am
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
library/Twitter/README.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <span itemprop="name">TwitterOAuth</span> [![Build Status](https://img.shields.io/travis/abraham/twitteroauth.svg)](https://travis-ci.org/abraham/twitteroauth) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/abraham/twitteroauth/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/abraham/twitteroauth/?branch=master) [![Issues Count](https://img.shields.io/github/issues/abraham/twitteroauth.svg)](https://github.com/abraham/twitteroauth/issues) [![Latest Version](https://img.shields.io/packagist/v/abraham/twitteroauth.svg)](https://packagist.org/packages/abraham/twitteroauth) [![Downloads this Month](https://img.shields.io/packagist/dm/abraham/twitteroauth.svg)](https://packagist.org/packages/abraham/twitteroauth)
2
+
3
+ ------------
4
+
5
+ <p itemprop="description">The most popular PHP library for Twitter's OAuth REST API.</p>
6
+
7
+ See documentation at https://twitteroauth.com.
8
+
9
+ PHP versions [listed](https://secure.php.net/supported-versions.php) as "active support" or "security fixes only" are supported.
10
+
11
+ <img src="https://raw.githubusercontent.com/abraham/twitteroauth-demo/master/images/twitter-logo-blue.png" itemprop="image" alt="Twitter bird" width="200px">
library/Twitter/autoload.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Use to autoload needed classes without Composer.
5
+ *
6
+ * @param string $class The fully-qualified class name.
7
+ * @return void
8
+ */
9
+ spl_autoload_register(function ($class) {
10
+
11
+ // project-specific namespace prefix
12
+ $prefix = 'Abraham\\TwitterOAuth\\';
13
+
14
+ // base directory for the namespace prefix
15
+ $base_dir = __DIR__ . '/src/';
16
+
17
+ // does the class use the namespace prefix?
18
+ $len = strlen($prefix);
19
+ if (strncmp($prefix, $class, $len) !== 0) {
20
+ // no, move to the next registered autoloader
21
+ return;
22
+ }
23
+
24
+ // get the relative class name
25
+ $relative_class = substr($class, $len);
26
+
27
+ // replace the namespace prefix with the base directory, replace namespace
28
+ // separators with directory separators in the relative class name, append
29
+ // with .php
30
+ $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
31
+ // if the file exists, require it
32
+ if (file_exists($file)) {
33
+ require $file;
34
+ }
35
+ });
library/Twitter/composer.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "abraham/twitteroauth",
3
+ "type": "library",
4
+ "description": "The most popular PHP library for use with the Twitter OAuth REST API.",
5
+ "keywords": ["twitter", "api", "oauth", "rest", "social", "twitter api", "twitter oauth"],
6
+ "license": "MIT",
7
+ "homepage": "https://twitteroauth.com",
8
+ "authors": [
9
+ {
10
+ "name": "Abraham Williams",
11
+ "email": "abraham@abrah.am",
12
+ "homepage": "https://abrah.am",
13
+ "role": "Developer"
14
+ }
15
+ ],
16
+ "support": {
17
+ "source": "https://github.com/abraham/twitteroauth",
18
+ "issues": "https://github.com/abraham/twitteroauth/issues"
19
+ },
20
+ "require": {
21
+ "php": "^7.2 || ^7.3",
22
+ "ext-curl": "*"
23
+ },
24
+ "require-dev": {
25
+ "phpunit/phpunit": "~5.7",
26
+ "squizlabs/php_codesniffer": "~3.0",
27
+ "phpmd/phpmd": "~2.6"
28
+ },
29
+ "autoload": {
30
+ "psr-4": {
31
+ "Abraham\\TwitterOAuth\\": "src"
32
+ }
33
+ }
34
+ }
library/Twitter/phpmd.xml ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <ruleset name="My first PHPMD rule set"
3
+ xmlns="http://pmd.sf.net/ruleset/1.0.0"
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
6
+ xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
7
+ <description>Keep TwitterOAuth source code clean.</description>
8
+
9
+ <!-- <rule ref="rulesets/cleancode.xml" /> -->
10
+ <rule ref="rulesets/codesize.xml" />
11
+ <rule ref="rulesets/controversial.xml" />
12
+ <rule ref="rulesets/design.xml" />
13
+ <rule ref="rulesets/naming.xml" />
14
+ <rule ref="rulesets/unusedcode.xml" />
15
+ </ruleset>
library/Twitter/phpunit.xml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <phpunit
3
+ colors="true"
4
+ bootstrap="tests/bootstrap.php">
5
+
6
+ <testsuites>
7
+ <testsuite name="TwitterOAuth Test Suite">
8
+ <directory>./tests/</directory>
9
+ </testsuite>
10
+ </testsuites>
11
+ </phpunit>
library/Twitter/src/Config.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Abraham\TwitterOAuth;
4
+
5
+ /**
6
+ * Handle setting and storing config for TwitterOAuth.
7
+ *
8
+ * @author Abraham Williams <abraham@abrah.am>
9
+ */
10
+ class Config
11
+ {
12
+ /** @var int How long to wait for a response from the API */
13
+ protected $timeout = 15;
14
+ /** @var int how long to wait while connecting to the API */
15
+ protected $connectionTimeout = 15;
16
+ /** @var int How many times we retry request when API is down */
17
+ protected $maxRetries = 0;
18
+ /** @var int Delay in seconds before we retry the request */
19
+ protected $retriesDelay = 1;
20
+
21
+ /**
22
+ * Decode JSON Response as associative Array
23
+ *
24
+ * @see http://php.net/manual/en/function.json-decode.php
25
+ *
26
+ * @var bool
27
+ */
28
+ protected $decodeJsonAsArray = false;
29
+ /** @var string User-Agent header */
30
+ protected $userAgent = 'TwitterOAuth (+https://twitteroauth.com)';
31
+ /** @var array Store proxy connection details */
32
+ protected $proxy = [];
33
+
34
+ /** @var bool Whether to encode the curl requests with gzip or not */
35
+ protected $gzipEncoding = true;
36
+
37
+ /** @var integer Size for Chunked Uploads */
38
+ protected $chunkSize = 250000; // 0.25 MegaByte
39
+
40
+ /**
41
+ * Set the connection and response timeouts.
42
+ *
43
+ * @param int $connectionTimeout
44
+ * @param int $timeout
45
+ */
46
+ public function setTimeouts($connectionTimeout, $timeout)
47
+ {
48
+ $this->connectionTimeout = (int)$connectionTimeout;
49
+ $this->timeout = (int)$timeout;
50
+ }
51
+
52
+ /**
53
+ * Set the number of times to retry on error and how long between each.
54
+ *
55
+ * @param int $maxRetries
56
+ * @param int $retriesDelay
57
+ */
58
+ public function setRetries($maxRetries, $retriesDelay)
59
+ {
60
+ $this->maxRetries = (int)$maxRetries;
61
+ $this->retriesDelay = (int)$retriesDelay;
62
+ }
63
+
64
+ /**
65
+ * @param bool $value
66
+ */
67
+ public function setDecodeJsonAsArray($value)
68
+ {
69
+ $this->decodeJsonAsArray = (bool)$value;
70
+ }
71
+
72
+ /**
73
+ * @param string $userAgent
74
+ */
75
+ public function setUserAgent($userAgent)
76
+ {
77
+ $this->userAgent = (string)$userAgent;
78
+ }
79
+
80
+ /**
81
+ * @param array $proxy
82
+ */
83
+ public function setProxy(array $proxy)
84
+ {
85
+ $this->proxy = $proxy;
86
+ }
87
+
88
+ /**
89
+ * Whether to encode the curl requests with gzip or not.
90
+ *
91
+ * @param boolean $gzipEncoding
92
+ */
93
+ public function setGzipEncoding($gzipEncoding)
94
+ {
95
+ $this->gzipEncoding = (bool)$gzipEncoding;
96
+ }
97
+
98
+ /**
99
+ * Set the size of each part of file for chunked media upload.
100
+ *
101
+ * @param int $value
102
+ */
103
+ public function setChunkSize($value)
104
+ {
105
+ $this->chunkSize = (int)$value;
106
+ }
107
+ }
library/Twitter/src/Consumer.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The MIT License
4
+ * Copyright (c) 2007 Andy Smith
5
+ */
6
+ namespace Abraham\TwitterOAuth;
7
+
8
+ class Consumer
9
+ {
10
+ /** @var string */
11
+ public $key;
12
+ /** @var string */
13
+ public $secret;
14
+ /** @var string|null */
15
+ public $callbackUrl;
16
+
17
+ /**
18
+ * @param string $key
19
+ * @param string $secret
20
+ * @param null $callbackUrl
21
+ */
22
+ public function __construct($key, $secret, $callbackUrl = null)
23
+ {
24
+ $this->key = $key;
25
+ $this->secret = $secret;
26
+ $this->callbackUrl = $callbackUrl;
27
+ }
28
+
29
+ /**
30
+ * @return string
31
+ */
32
+ public function __toString()
33
+ {
34
+ return "Consumer[key=$this->key,secret=$this->secret]";
35
+ }
36
+ }
library/Twitter/src/HmacSha1.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The MIT License
4
+ * Copyright (c) 2007 Andy Smith
5
+ */
6
+ namespace Abraham\TwitterOAuth;
7
+
8
+ /**
9
+ * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104]
10
+ * where the Signature Base String is the text and the key is the concatenated values (each first
11
+ * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&'
12
+ * character (ASCII code 38) even if empty.
13
+ * - Chapter 9.2 ("HMAC-SHA1")
14
+ */
15
+ class HmacSha1 extends SignatureMethod
16
+ {
17
+ /**
18
+ * {@inheritDoc}
19
+ */
20
+ public function getName()
21
+ {
22
+ return "HMAC-SHA1";
23
+ }
24
+
25
+ /**
26
+ * {@inheritDoc}
27
+ */
28
+ public function buildSignature(Request $request, Consumer $consumer, Token $token = null)
29
+ {
30
+ $signatureBase = $request->getSignatureBaseString();
31
+
32
+ $parts = [$consumer->secret, null !== $token ? $token->secret : ""];
33
+
34
+ $parts = Util::urlencodeRfc3986($parts);
35
+ $key = implode('&', $parts);
36
+
37
+ return base64_encode(hash_hmac('sha1', $signatureBase, $key, true));
38
+ }
39
+ }
library/Twitter/src/Request.php ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The MIT License
4
+ * Copyright (c) 2007 Andy Smith
5
+ */
6
+ namespace Abraham\TwitterOAuth;
7
+
8
+ class Request
9
+ {
10
+ protected $parameters;
11
+ protected $httpMethod;
12
+ protected $httpUrl;
13
+ protected $json;
14
+ public static $version = '1.0';
15
+
16
+ /**
17
+ * Constructor
18
+ *
19
+ * @param string $httpMethod
20
+ * @param string $httpUrl
21
+ * @param array|null $parameters
22
+ */
23
+ public function __construct($httpMethod, $httpUrl, array $parameters = [])
24
+ {
25
+ $parameters = array_merge(Util::parseParameters(parse_url($httpUrl, PHP_URL_QUERY)), $parameters);
26
+ $this->parameters = $parameters;
27
+ $this->httpMethod = $httpMethod;
28
+ $this->httpUrl = $httpUrl;
29
+ }
30
+
31
+ /**
32
+ * pretty much a helper function to set up the request
33
+ *
34
+ * @param Consumer $consumer
35
+ * @param Token $token
36
+ * @param string $httpMethod
37
+ * @param string $httpUrl
38
+ * @param array $parameters
39
+ *
40
+ * @return Request
41
+ */
42
+ public static function fromConsumerAndToken(
43
+ Consumer $consumer,
44
+ Token $token = null,
45
+ $httpMethod,
46
+ $httpUrl,
47
+ array $parameters = [],
48
+ $json = false
49
+ ) {
50
+ $defaults = [
51
+ "oauth_version" => Request::$version,
52
+ "oauth_nonce" => Request::generateNonce(),
53
+ "oauth_timestamp" => time(),
54
+ "oauth_consumer_key" => $consumer->key
55
+ ];
56
+ if (null !== $token) {
57
+ $defaults['oauth_token'] = $token->key;
58
+ }
59
+
60
+ // The json payload is not included in the signature on json requests,
61
+ // therefore it shouldn't be included in the parameters array.
62
+ if ($json) {
63
+ $parameters = $defaults;
64
+ } else {
65
+ $parameters = array_merge($defaults, $parameters);
66
+ }
67
+
68
+ return new Request($httpMethod, $httpUrl, $parameters);
69
+ }
70
+
71
+ /**
72
+ * @param string $name
73
+ * @param string $value
74
+ */
75
+ public function setParameter($name, $value)
76
+ {
77
+ $this->parameters[$name] = $value;
78
+ }
79
+
80
+ /**
81
+ * @param $name
82
+ *
83
+ * @return string|null
84
+ */
85
+ public function getParameter($name)
86
+ {
87
+ return isset($this->parameters[$name]) ? $this->parameters[$name] : null;
88
+ }
89
+
90
+ /**
91
+ * @return array
92
+ */
93
+ public function getParameters()
94
+ {
95
+ return $this->parameters;
96
+ }
97
+
98
+ /**
99
+ * @param $name
100
+ */
101
+ public function removeParameter($name)
102
+ {
103
+ unset($this->parameters[$name]);
104
+ }
105
+
106
+ /**
107
+ * The request parameters, sorted and concatenated into a normalized string.
108
+ *
109
+ * @return string
110
+ */
111
+ public function getSignableParameters()
112
+ {
113
+ // Grab all parameters
114
+ $params = $this->parameters;
115
+
116
+ // Remove oauth_signature if present
117
+ // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")
118
+ if (isset($params['oauth_signature'])) {
119
+ unset($params['oauth_signature']);
120
+ }
121
+
122
+ return Util::buildHttpQuery($params);
123
+ }
124
+
125
+ /**
126
+ * Returns the base string of this request
127
+ *
128
+ * The base string defined as the method, the url
129
+ * and the parameters (normalized), each urlencoded
130
+ * and the concated with &.
131
+ *
132
+ * @return string
133
+ */
134
+ public function getSignatureBaseString()
135
+ {
136
+ $parts = [
137
+ $this->getNormalizedHttpMethod(),
138
+ $this->getNormalizedHttpUrl(),
139
+ $this->getSignableParameters()
140
+ ];
141
+
142
+ $parts = Util::urlencodeRfc3986($parts);
143
+
144
+ return implode('&', $parts);
145
+ }
146
+
147
+ /**
148
+ * Returns the HTTP Method in uppercase
149
+ *
150
+ * @return string
151
+ */
152
+ public function getNormalizedHttpMethod()
153
+ {
154
+ return strtoupper($this->httpMethod);
155
+ }
156
+
157
+ /**
158
+ * parses the url and rebuilds it to be
159
+ * scheme://host/path
160
+ *
161
+ * @return string
162
+ */
163
+ public function getNormalizedHttpUrl()
164
+ {
165
+ $parts = parse_url($this->httpUrl);
166
+
167
+ $scheme = $parts['scheme'];
168
+ $host = strtolower($parts['host']);
169
+ $path = $parts['path'];
170
+
171
+ return "$scheme://$host$path";
172
+ }
173
+
174
+ /**
175
+ * Builds a url usable for a GET request
176
+ *
177
+ * @return string
178
+ */
179
+ public function toUrl()
180
+ {
181
+ $postData = $this->toPostdata();
182
+ $out = $this->getNormalizedHttpUrl();
183
+ if ($postData) {
184
+ $out .= '?' . $postData;
185
+ }
186
+ return $out;
187
+ }
188
+
189
+ /**
190
+ * Builds the data one would send in a POST request
191
+ *
192
+ * @return string
193
+ */
194
+ public function toPostdata()
195
+ {
196
+ return Util::buildHttpQuery($this->parameters);
197
+ }
198
+
199
+ /**
200
+ * Builds the Authorization: header
201
+ *
202
+ * @return string
203
+ * @throws TwitterOAuthException
204
+ */
205
+ public function toHeader()
206
+ {
207
+ $first = true;
208
+ $out = 'Authorization: OAuth';
209
+ foreach ($this->parameters as $k => $v) {
210
+ if (substr($k, 0, 5) != "oauth") {
211
+ continue;
212
+ }
213
+ if (is_array($v)) {
214
+ throw new TwitterOAuthException('Arrays not supported in headers');
215
+ }
216
+ $out .= ($first) ? ' ' : ', ';
217
+ $out .= Util::urlencodeRfc3986($k) . '="' . Util::urlencodeRfc3986($v) . '"';
218
+ $first = false;
219
+ }
220
+ return $out;
221
+ }
222
+
223
+ /**
224
+ * @return string
225
+ */
226
+ public function __toString()
227
+ {
228
+ return $this->toUrl();
229
+ }
230
+
231
+ /**
232
+ * @param SignatureMethod $signatureMethod
233
+ * @param Consumer $consumer
234
+ * @param Token $token
235
+ */
236
+ public function signRequest(SignatureMethod $signatureMethod, Consumer $consumer, Token $token = null)
237
+ {
238
+ $this->setParameter("oauth_signature_method", $signatureMethod->getName());
239
+ $signature = $this->buildSignature($signatureMethod, $consumer, $token);
240
+ $this->setParameter("oauth_signature", $signature);
241
+ }
242
+
243
+ /**
244
+ * @param SignatureMethod $signatureMethod
245
+ * @param Consumer $consumer
246
+ * @param Token $token
247
+ *
248
+ * @return string
249
+ */
250
+ public function buildSignature(SignatureMethod $signatureMethod, Consumer $consumer, Token $token = null)
251
+ {
252
+ return $signatureMethod->buildSignature($this, $consumer, $token);
253
+ }
254
+
255
+ /**
256
+ * @return string
257
+ */
258
+ public static function generateNonce()
259
+ {
260
+ return md5(microtime() . mt_rand());
261
+ }
262
+ }
library/Twitter/src/Response.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Abraham\TwitterOAuth;
4
+
5
+ /**
6
+ * The result of the most recent API request.
7
+ *
8
+ * @author Abraham Williams <abraham@abrah.am>
9
+ */
10
+ class Response
11
+ {
12
+ /** @var string|null API path from the most recent request */
13
+ private $apiPath;
14
+ /** @var int HTTP status code from the most recent request */
15
+ private $httpCode = 0;
16
+ /** @var array HTTP headers from the most recent request */
17
+ private $headers = [];
18
+ /** @var array|object Response body from the most recent request */
19
+ private $body = [];
20
+ /** @var array HTTP headers from the most recent request that start with X */
21
+ private $xHeaders = [];
22
+
23
+ /**
24
+ * @param string $apiPath
25
+ */
26
+ public function setApiPath($apiPath)
27
+ {
28
+ $this->apiPath = $apiPath;
29
+ }
30
+
31
+ /**
32
+ * @return string|null
33
+ */
34
+ public function getApiPath()
35
+ {
36
+ return $this->apiPath;
37
+ }
38
+
39
+ /**
40
+ * @param array|object $body
41
+ */
42
+ public function setBody($body)
43
+ {
44
+ $this->body = $body;
45
+ }
46
+
47
+ /**
48
+ * @return array|object|string
49
+ */
50
+ public function getBody()
51
+ {
52
+ return $this->body;
53
+ }
54
+
55
+ /**
56
+ * @param int $httpCode
57
+ */
58
+ public function setHttpCode($httpCode)
59
+ {
60
+ $this->httpCode = $httpCode;
61
+ }
62
+
63
+ /**
64
+ * @return int
65
+ */
66
+ public function getHttpCode()
67
+ {
68
+ return $this->httpCode;
69
+ }
70
+
71
+ /**
72
+ * @param array $headers
73
+ */
74
+ public function setHeaders(array $headers)
75
+ {
76
+ foreach ($headers as $key => $value) {
77
+ if (substr($key, 0, 1) == 'x') {
78
+ $this->xHeaders[$key] = $value;
79
+ }
80
+ }
81
+ $this->headers = $headers;
82
+ }
83
+
84
+ /**
85
+ * @return array
86
+ */
87
+ public function getsHeaders()
88
+ {
89
+ return $this->headers;
90
+ }
91
+
92
+ /**
93
+ * @param array $xHeaders
94
+ */
95
+ public function setXHeaders(array $xHeaders = [])
96
+ {
97
+ $this->xHeaders = $xHeaders;
98
+ }
99
+
100
+ /**
101
+ * @return array
102
+ */
103
+ public function getXHeaders()
104
+ {
105
+ return $this->xHeaders;
106
+ }
107
+ }
library/Twitter/src/SignatureMethod.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The MIT License
4
+ * Copyright (c) 2007 Andy Smith
5
+ */
6
+ namespace Abraham\TwitterOAuth;
7
+
8
+ /**
9
+ * A class for implementing a Signature Method
10
+ * See section 9 ("Signing Requests") in the spec
11
+ */
12
+ abstract class SignatureMethod
13
+ {
14
+ /**
15
+ * Needs to return the name of the Signature Method (ie HMAC-SHA1)
16
+ *
17
+ * @return string
18
+ */
19
+ abstract public function getName();
20
+
21
+ /**
22
+ * Build up the signature
23
+ * NOTE: The output of this function MUST NOT be urlencoded.
24
+ * the encoding is handled in OAuthRequest when the final
25
+ * request is serialized
26
+ *
27
+ * @param Request $request
28
+ * @param Consumer $consumer
29
+ * @param Token $token
30
+ *
31
+ * @return string
32
+ */
33
+ abstract public function buildSignature(Request $request, Consumer $consumer, Token $token = null);
34
+
35
+ /**
36
+ * Verifies that a given signature is correct
37
+ *
38
+ * @param Request $request
39
+ * @param Consumer $consumer
40
+ * @param Token $token
41
+ * @param string $signature
42
+ *
43
+ * @return bool
44
+ */
45
+ public function checkSignature(Request $request, Consumer $consumer, Token $token, $signature)
46
+ {
47
+ $built = $this->buildSignature($request, $consumer, $token);
48
+
49
+ // Check for zero length, although unlikely here
50
+ if (strlen($built) == 0 || strlen($signature) == 0) {
51
+ return false;
52
+ }
53
+
54
+ if (strlen($built) != strlen($signature)) {
55
+ return false;
56
+ }
57
+
58
+ // Avoid a timing leak with a (hopefully) time insensitive compare
59
+ $result = 0;
60
+ for ($i = 0; $i < strlen($signature); $i++) {
61
+ $result |= ord($built[$i]) ^ ord($signature[$i]);
62
+ }
63
+
64
+ return $result == 0;
65
+ }
66
+ }
library/Twitter/src/Token.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The MIT License
4
+ * Copyright (c) 2007 Andy Smith
5
+ */
6
+ namespace Abraham\TwitterOAuth;
7
+
8
+ class Token
9
+ {
10
+ /** @var string */
11
+ public $key;
12
+ /** @var string */
13
+ public $secret;
14
+
15
+ /**
16
+ * @param string $key The OAuth Token
17
+ * @param string $secret The OAuth Token Secret
18
+ */
19
+ public function __construct($key, $secret)
20
+ {
21
+ $this->key = $key;
22
+ $this->secret = $secret;
23
+ }
24
+
25
+ /**
26
+ * Generates the basic string serialization of a token that a server
27
+ * would respond to request_token and access_token calls with
28
+ *
29
+ * @return string
30
+ */
31
+ public function __toString()
32
+ {
33
+ return sprintf(
34
+ "oauth_token=%s&oauth_token_secret=%s",
35
+ Util::urlencodeRfc3986($this->key),
36
+ Util::urlencodeRfc3986($this->secret)
37
+ );
38
+ }
39
+ }
library/Twitter/src/TwitterOAuth.php ADDED
@@ -0,0 +1,617 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The most popular PHP library for use with the Twitter OAuth REST API.
4
+ *
5
+ * @license MIT
6
+ */
7
+ namespace Abraham\TwitterOAuth;
8
+
9
+ use Abraham\TwitterOAuth\Util\JsonDecoder;
10
+
11
+ /**
12
+ * TwitterOAuth class for interacting with the Twitter API.
13
+ *
14
+ * @author Abraham Williams <abraham@abrah.am>
15
+ */
16
+ class TwitterOAuth extends Config
17
+ {
18
+ const API_VERSION = '1.1';
19
+ const API_HOST = 'https://api.twitter.com';
20
+ const UPLOAD_HOST = 'https://upload.twitter.com';
21
+
22
+ /** @var Response details about the result of the last request */
23
+ private $response;
24
+ /** @var string|null Application bearer token */
25
+ private $bearer;
26
+ /** @var Consumer Twitter application details */
27
+ private $consumer;
28
+ /** @var Token|null User access token details */
29
+ private $token;
30
+ /** @var HmacSha1 OAuth 1 signature type used by Twitter */
31
+ private $signatureMethod;
32
+ /** @var int Number of attempts we made for the request */
33
+ private $attempts = 0;
34
+
35
+ /**
36
+ * Constructor
37
+ *
38
+ * @param string $consumerKey The Application Consumer Key
39
+ * @param string $consumerSecret The Application Consumer Secret
40
+ * @param string|null $oauthToken The Client Token (optional)
41
+ * @param string|null $oauthTokenSecret The Client Token Secret (optional)
42
+ */
43
+ public function __construct($consumerKey, $consumerSecret, $oauthToken = null, $oauthTokenSecret = null)
44
+ {
45
+ $this->resetLastResponse();
46
+ $this->signatureMethod = new HmacSha1();
47
+ $this->consumer = new Consumer($consumerKey, $consumerSecret);
48
+ if (!empty($oauthToken) && !empty($oauthTokenSecret)) {
49
+ $this->setOauthToken($oauthToken, $oauthTokenSecret);
50
+ }
51
+ if (empty($oauthToken) && !empty($oauthTokenSecret)) {
52
+ $this->setBearer($oauthTokenSecret);
53
+ }
54
+ }
55
+
56
+ /**
57
+ * @param string $oauthToken
58
+ * @param string $oauthTokenSecret
59
+ */
60
+ public function setOauthToken($oauthToken, $oauthTokenSecret)
61
+ {
62
+ $this->token = new Token($oauthToken, $oauthTokenSecret);
63
+ $this->bearer = null;
64
+ }
65
+
66
+ /**
67
+ * @param string $oauthTokenSecret
68
+ */
69
+ public function setBearer($oauthTokenSecret)
70
+ {
71
+ $this->bearer = $oauthTokenSecret;
72
+ $this->token = null;
73
+ }
74
+
75
+ /**
76
+ * @return string|null
77
+ */
78
+ public function getLastApiPath()
79
+ {
80
+ return $this->response->getApiPath();
81
+ }
82
+
83
+ /**
84
+ * @return int
85
+ */
86
+ public function getLastHttpCode()
87
+ {
88
+ return $this->response->getHttpCode();
89
+ }
90
+
91
+ /**
92
+ * @return array
93
+ */
94
+ public function getLastXHeaders()
95
+ {
96
+ return $this->response->getXHeaders();
97
+ }
98
+
99
+ /**
100
+ * @return array|object|null
101
+ */
102
+ public function getLastBody()
103
+ {
104
+ return $this->response->getBody();
105
+ }
106
+
107
+ /**
108
+ * Resets the last response cache.
109
+ */
110
+ public function resetLastResponse()
111
+ {
112
+ $this->response = new Response();
113
+ }
114
+
115
+ /**
116
+ * Resets the attempts number.
117
+ */
118
+ private function resetAttemptsNumber()
119
+ {
120
+ $this->attempts = 0;
121
+ }
122
+
123
+ /**
124
+ * Delays the retries when they're activated.
125
+ */
126
+ private function sleepIfNeeded()
127
+ {
128
+ if ($this->maxRetries && $this->attempts) {
129
+ sleep($this->retriesDelay);
130
+ }
131
+ }
132
+
133
+
134
+ /**
135
+ * Make URLs for user browser navigation.
136
+ *
137
+ * @param string $path
138
+ * @param array $parameters
139
+ *
140
+ * @return string
141
+ */
142
+ public function url($path, array $parameters)
143
+ {
144
+ $this->resetLastResponse();
145
+ $this->response->setApiPath($path);
146
+ $query = http_build_query($parameters);
147
+ return sprintf('%s/%s?%s', self::API_HOST, $path, $query);
148
+ }
149
+
150
+ /**
151
+ * Make /oauth/* requests to the API.
152
+ *
153
+ * @param string $path
154
+ * @param array $parameters
155
+ *
156
+ * @return array
157
+ * @throws TwitterOAuthException
158
+ */
159
+ public function oauth($path, array $parameters = [])
160
+ {
161
+ $response = [];
162
+ $this->resetLastResponse();
163
+ $this->response->setApiPath($path);
164
+ $url = sprintf('%s/%s', self::API_HOST, $path);
165
+ $result = $this->oAuthRequest($url, 'POST', $parameters);
166
+
167
+ if ($this->getLastHttpCode() != 200) {
168
+ throw new TwitterOAuthException($result);
169
+ }
170
+
171
+ parse_str($result, $response);
172
+ $this->response->setBody($response);
173
+
174
+ return $response;
175
+ }
176
+
177
+ /**
178
+ * Make /oauth2/* requests to the API.
179
+ *
180
+ * @param string $path
181
+ * @param array $parameters
182
+ *
183
+ * @return array|object
184
+ */
185
+ public function oauth2($path, array $parameters = [])
186
+ {
187
+ $method = 'POST';
188
+ $this->resetLastResponse();
189
+ $this->response->setApiPath($path);
190
+ $url = sprintf('%s/%s', self::API_HOST, $path);
191
+ $request = Request::fromConsumerAndToken($this->consumer, $this->token, $method, $url, $parameters);
192
+ $authorization = 'Authorization: Basic ' . $this->encodeAppAuthorization($this->consumer);
193
+ $result = $this->request($request->getNormalizedHttpUrl(), $method, $authorization, $parameters);
194
+ $response = JsonDecoder::decode($result, $this->decodeJsonAsArray);
195
+ $this->response->setBody($response);
196
+ return $response;
197
+ }
198
+
199
+ /**
200
+ * Make GET requests to the API.
201
+ *
202
+ * @param string $path
203
+ * @param array $parameters
204
+ *
205
+ * @return array|object
206
+ */
207
+ public function get($path, array $parameters = [])
208
+ {
209
+ return $this->http('GET', self::API_HOST, $path, $parameters, false);
210
+ }
211
+
212
+ /**
213
+ * Make POST requests to the API.
214
+ *
215
+ * @param string $path
216
+ * @param array $parameters
217
+ * @param bool $json
218
+ *
219
+ * @return array|object
220
+ */
221
+ public function post($path, array $parameters = [], $json = false)
222
+ {
223
+ return $this->http('POST', self::API_HOST, $path, $parameters, $json);
224
+ }
225
+
226
+ /**
227
+ * Make DELETE requests to the API.
228
+ *
229
+ * @param string $path
230
+ * @param array $parameters
231
+ *
232
+ * @return array|object
233
+ */
234
+ public function delete($path, array $parameters = [])
235
+ {
236
+ return $this->http('DELETE', self::API_HOST, $path, $parameters, false);
237
+ }
238
+
239
+ /**
240
+ * Make PUT requests to the API.
241
+ *
242
+ * @param string $path
243
+ * @param array $parameters
244
+ *
245
+ * @return array|object
246
+ */
247
+ public function put($path, array $parameters = [])
248
+ {
249
+ return $this->http('PUT', self::API_HOST, $path, $parameters, false);
250
+ }
251
+
252
+ /**
253
+ * Upload media to upload.twitter.com.
254
+ *
255
+ * @param string $path
256
+ * @param array $parameters
257
+ * @param boolean $chunked
258
+ *
259
+ * @return array|object
260
+ */
261
+ public function upload($path, array $parameters = [], $chunked = false)
262
+ {
263
+ if ($chunked) {
264
+ return $this->uploadMediaChunked($path, $parameters);
265
+ } else {
266
+ return $this->uploadMediaNotChunked($path, $parameters);
267
+ }
268
+ }
269
+
270
+ /**
271
+ * Progression of media upload
272
+ *
273
+ * @param string $media_id
274
+ *
275
+ * @return array|object
276
+ */
277
+ public function mediaStatus($media_id)
278
+ {
279
+ return $this->http('GET', self::UPLOAD_HOST, 'media/upload', [
280
+ 'command' => 'STATUS',
281
+ 'media_id' => $media_id
282
+ ], false);
283
+ }
284
+
285
+ /**
286
+ * Private method to upload media (not chunked) to upload.twitter.com.
287
+ *
288
+ * @param string $path
289
+ * @param array $parameters
290
+ *
291
+ * @return array|object
292
+ */
293
+ private function uploadMediaNotChunked($path, array $parameters)
294
+ {
295
+ if (! is_readable($parameters['media']) ||
296
+ ($file = file_get_contents($parameters['media'])) === false) {
297
+ throw new \InvalidArgumentException('You must supply a readable file');
298
+ }
299
+ $parameters['media'] = base64_encode($file);
300
+ return $this->http('POST', self::UPLOAD_HOST, $path, $parameters, false);
301
+ }
302
+
303
+ /**
304
+ * Private method to upload media (chunked) to upload.twitter.com.
305
+ *
306
+ * @param string $path
307
+ * @param array $parameters
308
+ *
309
+ * @return array|object
310
+ */
311
+ private function uploadMediaChunked($path, array $parameters)
312
+ {
313
+ $init = $this->http('POST', self::UPLOAD_HOST, $path, $this->mediaInitParameters($parameters), false);
314
+ // Append
315
+ $segmentIndex = 0;
316
+ $media = fopen($parameters['media'], 'rb');
317
+ while (!feof($media)) {
318
+ $this->http('POST', self::UPLOAD_HOST, 'media/upload', [
319
+ 'command' => 'APPEND',
320
+ 'media_id' => $init->media_id_string,
321
+ 'segment_index' => $segmentIndex++,
322
+ 'media_data' => base64_encode(fread($media, $this->chunkSize))
323
+ ], false);
324
+ }
325
+ fclose($media);
326
+ // Finalize
327
+ $finalize = $this->http('POST', self::UPLOAD_HOST, 'media/upload', [
328
+ 'command' => 'FINALIZE',
329
+ 'media_id' => $init->media_id_string
330
+ ], false);
331
+ return $finalize;
332
+ }
333
+
334
+ /**
335
+ * Private method to get params for upload media chunked init.
336
+ * Twitter docs: https://dev.twitter.com/rest/reference/post/media/upload-init.html
337
+ *
338
+ * @param array $parameters
339
+ *
340
+ * @return array
341
+ */
342
+ private function mediaInitParameters(array $parameters)
343
+ {
344
+ $allowed_keys = ['media_type', 'additional_owners', 'media_category', 'shared'];
345
+ $base = [
346
+ 'command' => 'INIT',
347
+ 'total_bytes' => filesize($parameters['media'])
348
+ ];
349
+ $allowed_parameters = array_intersect_key($parameters, array_flip($allowed_keys));
350
+ return array_merge($base, $allowed_parameters);
351
+ }
352
+
353
+ /**
354
+ * Cleanup any parameters that are known not to work.
355
+ *
356
+ * @param array $parameters
357
+ *
358
+ * @return array
359
+ */
360
+ private function cleanUpParameters(array $parameters)
361
+ {
362
+ foreach ($parameters as $key => $value) {
363
+ // PHP coerces `true` to `"1"` which some Twitter APIs don't like.
364
+ if (is_bool($value)) {
365
+ $parameters[$key] = var_export($value, true);
366
+ }
367
+ }
368
+ return $parameters;
369
+ }
370
+
371
+ /**
372
+ * @param string $method
373
+ * @param string $host
374
+ * @param string $path
375
+ * @param array $parameters
376
+ * @param bool $json
377
+ *
378
+ * @return array|object
379
+ */
380
+ private function http($method, $host, $path, array $parameters, $json)
381
+ {
382
+ $this->resetLastResponse();
383
+ $this->resetAttemptsNumber();
384
+ $url = sprintf('%s/%s/%s.json', $host, self::API_VERSION, $path);
385
+ $this->response->setApiPath($path);
386
+ if (!$json) {
387
+ $parameters = $this->cleanUpParameters($parameters);
388
+ }
389
+ return $this->makeRequests($url, $method, $parameters, $json);
390
+ }
391
+
392
+ /**
393
+ *
394
+ * Make requests and retry them (if enabled) in case of Twitter's problems.
395
+ *
396
+ * @param string $method
397
+ * @param string $url
398
+ * @param string $method
399
+ * @param array $parameters
400
+ * @param bool $json
401
+ *
402
+ * @return array|object
403
+ */
404
+ private function makeRequests($url, $method, array $parameters, $json)
405
+ {
406
+ do {
407
+ $this->sleepIfNeeded();
408
+ $result = $this->oAuthRequest($url, $method, $parameters, $json);
409
+ $response = JsonDecoder::decode($result, $this->decodeJsonAsArray);
410
+ $this->response->setBody($response);
411
+ $this->attempts++;
412
+ // Retry up to our $maxRetries number if we get errors greater than 500 (over capacity etc)
413
+ } while ($this->requestsAvailable());
414
+
415
+ return $response;
416
+ }
417
+
418
+ /**
419
+ * Checks if we have to retry request if API is down.
420
+ *
421
+ * @return bool
422
+ */
423
+ private function requestsAvailable()
424
+ {
425
+ return ($this->maxRetries && ($this->attempts <= $this->maxRetries) && $this->getLastHttpCode() >= 500);
426
+ }
427
+
428
+ /**
429
+ * Format and sign an OAuth / API request
430
+ *
431
+ * @param string $url
432
+ * @param string $method
433
+ * @param array $parameters
434
+ * @param bool $json
435
+ *
436
+ * @return string
437
+ * @throws TwitterOAuthException
438
+ */
439
+ private function oAuthRequest($url, $method, array $parameters, $json = false)
440
+ {
441
+ $request = Request::fromConsumerAndToken($this->consumer, $this->token, $method, $url, $parameters, $json);
442
+ if (array_key_exists('oauth_callback', $parameters)) {
443
+ // Twitter doesn't like oauth_callback as a parameter.
444
+ unset($parameters['oauth_callback']);
445
+ }
446
+ if ($this->bearer === null) {
447
+ $request->signRequest($this->signatureMethod, $this->consumer, $this->token);
448
+ $authorization = $request->toHeader();
449
+ if (array_key_exists('oauth_verifier', $parameters)) {
450
+ // Twitter doesn't always work with oauth in the body and in the header
451
+ // and it's already included in the $authorization header
452
+ unset($parameters['oauth_verifier']);
453
+ }
454
+ } else {
455
+ $authorization = 'Authorization: Bearer ' . $this->bearer;
456
+ }
457
+ return $this->request($request->getNormalizedHttpUrl(), $method, $authorization, $parameters, $json);
458
+ }
459
+
460
+ /**
461
+ * Set Curl options.
462
+ *
463
+ * @return array
464
+ */
465
+ private function curlOptions()
466
+ {
467
+ $options = [
468
+ // CURLOPT_VERBOSE => true,
469
+ CURLOPT_CONNECTTIMEOUT => $this->connectionTimeout,
470
+ CURLOPT_HEADER => true,
471
+ CURLOPT_RETURNTRANSFER => true,
472
+ CURLOPT_SSL_VERIFYHOST => 2,
473
+ CURLOPT_SSL_VERIFYPEER => true,
474
+ CURLOPT_TIMEOUT => $this->timeout,
475
+ CURLOPT_USERAGENT => $this->userAgent,
476
+ ];
477
+
478
+ if ($this->useCAFile()) {
479
+ $options[CURLOPT_CAINFO] = __DIR__ . DIRECTORY_SEPARATOR . 'cacert.pem';
480
+ }
481
+
482
+ if ($this->gzipEncoding) {
483
+ $options[CURLOPT_ENCODING] = 'gzip';
484
+ }
485
+
486
+ if (!empty($this->proxy)) {
487
+ $options[CURLOPT_PROXY] = $this->proxy['CURLOPT_PROXY'];
488
+ $options[CURLOPT_PROXYUSERPWD] = $this->proxy['CURLOPT_PROXYUSERPWD'];
489
+ $options[CURLOPT_PROXYPORT] = $this->proxy['CURLOPT_PROXYPORT'];
490
+ $options[CURLOPT_PROXYAUTH] = CURLAUTH_BASIC;
491
+ $options[CURLOPT_PROXYTYPE] = CURLPROXY_HTTP;
492
+ }
493
+
494
+ return $options;
495
+ }
496
+
497
+ /**
498
+ * Make an HTTP request
499
+ *
500
+ * @param string $url
501
+ * @param string $method
502
+ * @param string $authorization
503
+ * @param array $postfields
504
+ * @param bool $json
505
+ *
506
+ * @return string
507
+ * @throws TwitterOAuthException
508
+ */
509
+ private function request($url, $method, $authorization, array $postfields, $json = false)
510
+ {
511
+ $options = $this->curlOptions();
512
+ $options[CURLOPT_URL] = $url;
513
+ $options[CURLOPT_HTTPHEADER] = ['Accept: application/json', $authorization, 'Expect:'];
514
+
515
+ switch ($method) {
516
+ case 'GET':
517
+ break;
518
+ case 'POST':
519
+ $options[CURLOPT_POST] = true;
520
+ if ($json) {
521
+ $options[CURLOPT_HTTPHEADER][] = 'Content-type: application/json';
522
+ $options[CURLOPT_POSTFIELDS] = json_encode($postfields);
523
+ } else {
524
+ $options[CURLOPT_POSTFIELDS] = Util::buildHttpQuery($postfields);
525
+ }
526
+ break;
527
+ case 'DELETE':
528
+ $options[CURLOPT_CUSTOMREQUEST] = 'DELETE';
529
+ break;
530
+ case 'PUT':
531
+ $options[CURLOPT_CUSTOMREQUEST] = 'PUT';
532
+ break;
533
+ }
534
+
535
+ if (in_array($method, ['GET', 'PUT', 'DELETE']) && !empty($postfields)) {
536
+ $options[CURLOPT_URL] .= '?' . Util::buildHttpQuery($postfields);
537
+ }
538
+
539
+
540
+ $curlHandle = curl_init();
541
+ curl_setopt_array($curlHandle, $options);
542
+ $response = curl_exec($curlHandle);
543
+
544
+ // Throw exceptions on cURL errors.
545
+ if (curl_errno($curlHandle) > 0) {
546
+ $error = curl_error($curlHandle);
547
+ $errorNo = curl_errno($curlHandle);
548
+ curl_close($curlHandle);
549
+ throw new TwitterOAuthException($error, $errorNo);
550
+ }
551
+
552
+ $this->response->setHttpCode(curl_getinfo($curlHandle, CURLINFO_HTTP_CODE));
553
+ $parts = explode("\r\n\r\n", $response);
554
+ $responseBody = array_pop($parts);
555
+ $responseHeader = array_pop($parts);
556
+ $this->response->setHeaders($this->parseHeaders($responseHeader));
557
+
558
+ curl_close($curlHandle);
559
+
560
+ return $responseBody;
561
+ }
562
+
563
+ /**
564
+ * Get the header info to store.
565
+ *
566
+ * @param string $header
567
+ *
568
+ * @return array
569
+ */
570
+ private function parseHeaders($header)
571
+ {
572
+ $headers = [];
573
+ foreach (explode("\r\n", $header) as $line) {
574
+ if (strpos($line, ':') !== false) {
575
+ list ($key, $value) = explode(': ', $line);
576
+ $key = str_replace('-', '_', strtolower($key));
577
+ $headers[$key] = trim($value);
578
+ }
579
+ }
580
+ return $headers;
581
+ }
582
+
583
+ /**
584
+ * Encode application authorization header with base64.
585
+ *
586
+ * @param Consumer $consumer
587
+ *
588
+ * @return string
589
+ */
590
+ private function encodeAppAuthorization(Consumer $consumer)
591
+ {
592
+ $key = rawurlencode($consumer->key);
593
+ $secret = rawurlencode($consumer->secret);
594
+ return base64_encode($key . ':' . $secret);
595
+ }
596
+
597
+ /**
598
+ * Is the code running from a Phar module.
599
+ *
600
+ * @return boolean
601
+ */
602
+ private function pharRunning()
603
+ {
604
+ return class_exists('Phar') && \Phar::running(false) !== '';
605
+ }
606
+
607
+ /**
608
+ * Use included CA file instead of OS provided list.
609
+ *
610
+ * @return boolean
611
+ */
612
+ private function useCAFile()
613
+ {
614
+ /* Use CACert file when not in a PHAR file. */
615
+ return !$this->pharRunning();
616
+ }
617
+ }
library/Twitter/src/TwitterOAuthException.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Abraham\TwitterOAuth;
4
+
5
+ /**
6
+ * @author Abraham Williams <abraham@abrah.am>
7
+ */
8
+ class TwitterOAuthException extends \Exception
9
+ {
10
+ }
library/Twitter/src/Util.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The MIT License
4
+ * Copyright (c) 2007 Andy Smith
5
+ */
6
+ namespace Abraham\TwitterOAuth;
7
+
8
+ class Util
9
+ {
10
+ /**
11
+ * @param $input
12
+ *
13
+ * @return array|mixed|string
14
+ */
15
+ public static function urlencodeRfc3986($input)
16
+ {
17
+ $output = '';
18
+ if (is_array($input)) {
19
+ $output = array_map([__NAMESPACE__ . '\Util', 'urlencodeRfc3986'], $input);
20
+ } elseif (is_scalar($input)) {
21
+ $output = rawurlencode($input);
22
+ }
23
+ return $output;
24
+ }
25
+
26
+ /**
27
+ * @param string $string
28
+ *
29
+ * @return string
30
+ */
31
+ public static function urldecodeRfc3986($string)
32
+ {
33
+ return urldecode($string);
34
+ }
35
+
36
+ /**
37
+ * This function takes a input like a=b&a=c&d=e and returns the parsed
38
+ * parameters like this
39
+ * array('a' => array('b','c'), 'd' => 'e')
40
+ *
41
+ * @param string $input
42
+ *
43
+ * @return array
44
+ */
45
+ public static function parseParameters($input)
46
+ {
47
+ if (!is_string($input)) {
48
+ return [];
49
+ }
50
+
51
+ $pairs = explode('&', $input);
52
+
53
+ $parameters = [];
54
+ foreach ($pairs as $pair) {
55
+ $split = explode('=', $pair, 2);
56
+ $parameter = Util::urldecodeRfc3986($split[0]);
57
+ $value = isset($split[1]) ? Util::urldecodeRfc3986($split[1]) : '';
58
+
59
+ if (isset($parameters[$parameter])) {
60
+ // We have already recieved parameter(s) with this name, so add to the list
61
+ // of parameters with this name
62
+
63
+ if (is_scalar($parameters[$parameter])) {
64
+ // This is the first duplicate, so transform scalar (string) into an array
65
+ // so we can add the duplicates
66
+ $parameters[$parameter] = [$parameters[$parameter]];
67
+ }
68
+
69
+ $parameters[$parameter][] = $value;
70
+ } else {
71
+ $parameters[$parameter] = $value;
72
+ }
73
+ }
74
+ return $parameters;
75
+ }
76
+
77
+ /**
78
+ * @param array $params
79
+ *
80
+ * @return string
81
+ */
82
+ public static function buildHttpQuery(array $params)
83
+ {
84
+ if (empty($params)) {
85
+ return '';
86
+ }
87
+
88
+ // Urlencode both keys and values
89
+ $keys = Util::urlencodeRfc3986(array_keys($params));
90
+ $values = Util::urlencodeRfc3986(array_values($params));
91
+ $params = array_combine($keys, $values);
92
+
93
+ // Parameters are sorted by name, using lexicographical byte value ordering.
94
+ // Ref: Spec: 9.1.1 (1)
95
+ uksort($params, 'strcmp');
96
+
97
+ $pairs = [];
98
+ foreach ($params as $parameter => $value) {
99
+ if (is_array($value)) {
100
+ // If two or more parameters share the same name, they are sorted by their value
101
+ // Ref: Spec: 9.1.1 (1)
102
+ // June 12th, 2010 - changed to sort because of issue 164 by hidetaka
103
+ sort($value, SORT_STRING);
104
+ foreach ($value as $duplicateValue) {
105
+ $pairs[] = $parameter . '=' . $duplicateValue;
106
+ }
107
+ } else {
108
+ $pairs[] = $parameter . '=' . $value;
109
+ }
110
+ }
111
+ // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)
112
+ // Each name-value pair is separated by an '&' character (ASCII code 38)
113
+ return implode('&', $pairs);
114
+ }
115
+ }
library/Twitter/src/Util/JsonDecoder.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Abraham\TwitterOAuth\Util;
4
+
5
+ /**
6
+ * @author louis <louis@systemli.org>
7
+ */
8
+ class JsonDecoder
9
+ {
10
+ /**
11
+ * Decodes a JSON string to stdObject or associative array
12
+ *
13
+ * @param string $string
14
+ * @param bool $asArray
15
+ *
16
+ * @return array|object
17
+ */
18
+ public static function decode($string, $asArray)
19
+ {
20
+ if (version_compare(PHP_VERSION, '5.4.0', '>=') && !(defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) {
21
+ return json_decode($string, $asArray, 512, JSON_BIGINT_AS_STRING);
22
+ }
23
+
24
+ return json_decode($string, $asArray);
25
+ }
26
+ }
library/Twitter/src/cacert.pem ADDED
@@ -0,0 +1,3432 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##
2
+ ## Bundle of CA Root Certificates
3
+ ##
4
+ ## Certificate data from Mozilla as of: Wed Nov 27 04:12:10 2019 GMT
5
+ ##
6
+ ## This is a bundle of X.509 certificates of public Certificate Authorities
7
+ ## (CA). These were automatically extracted from Mozilla's root certificates
8
+ ## file (certdata.txt). This file can be found in the mozilla source tree:
9
+ ## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
10
+ ##
11
+ ## It contains the certificates in PEM format and therefore
12
+ ## can be directly used with curl / libcurl / php_curl, or with
13
+ ## an Apache+mod_ssl webserver for SSL client authentication.
14
+ ## Just configure this file as the SSLCACertificateFile.
15
+ ##
16
+ ## Conversion done with mk-ca-bundle.pl version 1.27.
17
+ ## SHA256: 607309057d0ec70f8e4e97b03906bafb2fcebb24cd37b5e8293e681ae26ceae0
18
+ ##
19
+
20
+
21
+ GlobalSign Root CA
22
+ ==================
23
+ -----BEGIN CERTIFICATE-----
24
+ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
25
+ GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
26
+ b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
27
+ BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
28
+ VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
29
+ DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
30
+ THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
31
+ Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
32
+ c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
33
+ gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
34
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
35
+ AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
36
+ Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
37
+ j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
38
+ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
39
+ X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
40
+ -----END CERTIFICATE-----
41
+
42
+ GlobalSign Root CA - R2
43
+ =======================
44
+ -----BEGIN CERTIFICATE-----
45
+ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
46
+ YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
47
+ bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
48
+ aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
49
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
50
+ ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
51
+ s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
52
+ S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
53
+ TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
54
+ ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
55
+ FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
56
+ YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
57
+ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
58
+ 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
59
+ 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
60
+ 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
61
+ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
62
+ -----END CERTIFICATE-----
63
+
64
+ Verisign Class 3 Public Primary Certification Authority - G3
65
+ ============================================================
66
+ -----BEGIN CERTIFICATE-----
67
+ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
68
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
69
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
70
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
71
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
72
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
73
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
74
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
75
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
76
+ ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
77
+ EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
78
+ cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
79
+ EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
80
+ 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
81
+ ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
82
+ j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
83
+ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
84
+ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
85
+ t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
86
+ -----END CERTIFICATE-----
87
+
88
+ Entrust.net Premium 2048 Secure Server CA
89
+ =========================================
90
+ -----BEGIN CERTIFICATE-----
91
+ MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
92
+ ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
93
+ bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
94
+ BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
95
+ NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
96
+ d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
97
+ MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
98
+ ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
99
+ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
100
+ Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
101
+ hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
102
+ nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
103
+ VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
104
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
105
+ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
106
+ T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
107
+ zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
108
+ J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
109
+ nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
110
+ -----END CERTIFICATE-----
111
+
112
+ Baltimore CyberTrust Root
113
+ =========================
114
+ -----BEGIN CERTIFICATE-----
115
+ MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
116
+ ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
117
+ ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
118
+ SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
119
+ dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
120
+ uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
121
+ UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
122
+ G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
123
+ XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
124
+ l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
125
+ VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
126
+ BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
127
+ cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
128
+ hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
129
+ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
130
+ RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
131
+ -----END CERTIFICATE-----
132
+
133
+ AddTrust External Root
134
+ ======================
135
+ -----BEGIN CERTIFICATE-----
136
+ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
137
+ QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
138
+ VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
139
+ NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
140
+ cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
141
+ Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
142
+ +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
143
+ Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
144
+ aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
145
+ 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
146
+ 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
147
+ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
148
+ VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
149
+ VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
150
+ IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
151
+ j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
152
+ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
153
+ e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
154
+ G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
155
+ -----END CERTIFICATE-----
156
+
157
+ Entrust Root Certification Authority
158
+ ====================================
159
+ -----BEGIN CERTIFICATE-----
160
+ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
161
+ BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
162
+ b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
163
+ A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
164
+ MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
165
+ MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
166
+ Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
167
+ dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
168
+ ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
169
+ A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
170
+ Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
171
+ j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
172
+ rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
173
+ DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
174
+ MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
175
+ hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
176
+ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
177
+ Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
178
+ v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
179
+ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
180
+ tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
181
+ -----END CERTIFICATE-----
182
+
183
+ GeoTrust Global CA
184
+ ==================
185
+ -----BEGIN CERTIFICATE-----
186
+ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
187
+ Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
188
+ MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
189
+ LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
190
+ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
191
+ BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
192
+ 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
193
+ T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
194
+ vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
195
+ AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
196
+ DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
197
+ zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
198
+ d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
199
+ mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
200
+ XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
201
+ Mw==
202
+ -----END CERTIFICATE-----
203
+
204
+ GeoTrust Universal CA
205
+ =====================
206
+ -----BEGIN CERTIFICATE-----
207
+ MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
208
+ R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
209
+ MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
210
+ Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
211
+ ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
212
+ JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
213
+ RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
214
+ 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
215
+ 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
216
+ qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
217
+ Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
218
+ Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
219
+ KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
220
+ ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
221
+ XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
222
+ hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
223
+ aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
224
+ qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
225
+ oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
226
+ xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
227
+ KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
228
+ DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
229
+ xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
230
+ p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
231
+ P/rmMuGNG2+k5o7Y+SlIis5z/iw=
232
+ -----END CERTIFICATE-----
233
+
234
+ GeoTrust Universal CA 2
235
+ =======================
236
+ -----BEGIN CERTIFICATE-----
237
+ MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
238
+ R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
239
+ MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
240
+ SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
241
+ A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
242
+ DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
243
+ j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
244
+ JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
245
+ QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
246
+ WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
247
+ 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
248
+ ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
249
+ SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
250
+ 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
251
+ +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
252
+ BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
253
+ dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
254
+ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
255
+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
256
+ A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
257
+ Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
258
+ pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
259
+ FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
260
+ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
261
+ X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
262
+ -----END CERTIFICATE-----
263
+
264
+ Comodo AAA Services root
265
+ ========================
266
+ -----BEGIN CERTIFICATE-----
267
+ MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
268
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
269
+ TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
270
+ MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
271
+ c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
272
+ BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
273
+ ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
274
+ C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
275
+ i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
276
+ Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
277
+ Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
278
+ Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
279
+ BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
280
+ cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
281
+ LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
282
+ 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
283
+ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
284
+ 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
285
+ 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
286
+ -----END CERTIFICATE-----
287
+
288
+ QuoVadis Root CA
289
+ ================
290
+ -----BEGIN CERTIFICATE-----
291
+ MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
292
+ ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
293
+ eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
294
+ MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
295
+ cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
296
+ EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
297
+ AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
298
+ J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
299
+ F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
300
+ YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
301
+ AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
302
+ PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
303
+ ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
304
+ MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
305
+ YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
306
+ ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
307
+ Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
308
+ Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
309
+ BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
310
+ FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
311
+ aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
312
+ tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
313
+ fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
314
+ LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
315
+ gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
316
+ 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
317
+ 5nrQNiOKSnQ2+Q==
318
+ -----END CERTIFICATE-----
319
+
320
+ QuoVadis Root CA 2
321
+ ==================
322
+ -----BEGIN CERTIFICATE-----
323
+ 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
349
+ -----END CERTIFICATE-----
350
+
351
+ QuoVadis Root CA 3
352
+ ==================
353
+ -----BEGIN CERTIFICATE-----
354
+ MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
355
+ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
356
+ OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
357
+ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
358
+ DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
359
+ DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
360
+ KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
361
+ DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
362
+ BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
363
+ p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
364
+ nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
365
+ MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
366
+ Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
367
+ uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
368
+ BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
369
+ YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
370
+ aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
371
+ BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
372
+ VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
373
+ ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
374
+ AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
375
+ qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
376
+ hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
377
+ POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
378
+ Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
379
+ 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
380
+ bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
381
+ g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
382
+ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
383
+ qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
384
+ -----END CERTIFICATE-----
385
+
386
+ Security Communication Root CA
387
+ ==============================
388
+ -----BEGIN CERTIFICATE-----
389
+ MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
390
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
391
+ HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
392
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
393
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
394
+ 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
395
+ DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
396
+ 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
397
+ DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
398
+ JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
399
+ DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
400
+ 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
401
+ mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
402
+ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
403
+ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
404
+ FL39vmwLAw==
405
+ -----END CERTIFICATE-----
406
+
407
+ Sonera Class 2 Root CA
408
+ ======================
409
+ -----BEGIN CERTIFICATE-----
410
+ MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
411
+ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
412
+ NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
413
+ IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
414
+ /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
415
+ dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
416
+ f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
417
+ tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
418
+ nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
419
+ XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
420
+ 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
421
+ cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
422
+ Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
423
+ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
424
+ llpwrN9M
425
+ -----END CERTIFICATE-----
426
+
427
+ XRamp Global CA Root
428
+ ====================
429
+ -----BEGIN CERTIFICATE-----
430
+ MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
431
+ BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
432
+ dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
433
+ dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
434
+ HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
435
+ U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
436
+ dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
437
+ IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
438
+ foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
439
+ zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
440
+ AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
441
+ xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
442
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
443
+ oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
444
+ AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
445
+ /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
446
+ qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
447
+ nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
448
+ 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
449
+ -----END CERTIFICATE-----
450
+
451
+ Go Daddy Class 2 CA
452
+ ===================
453
+ -----BEGIN CERTIFICATE-----
454
+ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
455
+ VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
456
+ ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
457
+ A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
458
+ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
459
+ ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
460
+ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
461
+ qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
462
+ YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
463
+ vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
464
+ BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
465
+ atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
466
+ MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
467
+ A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
468
+ PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
469
+ I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
470
+ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
471
+ Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
472
+ vZ8=
473
+ -----END CERTIFICATE-----
474
+
475
+ Starfield Class 2 CA
476
+ ====================
477
+ -----BEGIN CERTIFICATE-----
478
+ MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
479
+ U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
480
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
481
+ MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
482
+ A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
483
+ SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
484
+ bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
485
+ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
486
+ epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
487
+ F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
488
+ MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
489
+ hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
490
+ bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
491
+ QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
492
+ afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
493
+ PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
494
+ xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
495
+ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
496
+ QBFGmh95DmK/D5fs4C8fF5Q=
497
+ -----END CERTIFICATE-----
498
+
499
+ Taiwan GRCA
500
+ ===========
501
+ -----BEGIN CERTIFICATE-----
502
+ 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
527
+ -----END CERTIFICATE-----
528
+
529
+ DigiCert Assured ID Root CA
530
+ ===========================
531
+ -----BEGIN CERTIFICATE-----
532
+ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
533
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
534
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
535
+ MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
536
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
537
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
538
+ 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
539
+ UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
540
+ /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
541
+ oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
542
+ GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
543
+ 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
544
+ hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
545
+ EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
546
+ SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
547
+ 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
548
+ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
549
+ -----END CERTIFICATE-----
550
+
551
+ DigiCert Global Root CA
552
+ =======================
553
+ -----BEGIN CERTIFICATE-----
554
+ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
555
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
556
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
557
+ MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
558
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
559
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
560
+ TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
561
+ BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
562
+ 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
563
+ 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
564
+ o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
565
+ 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
566
+ BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
567
+ EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
568
+ tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
569
+ UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
570
+ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
571
+ -----END CERTIFICATE-----
572
+
573
+ DigiCert High Assurance EV Root CA
574
+ ==================================
575
+ -----BEGIN CERTIFICATE-----
576
+ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
577
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
578
+ KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
579
+ MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
580
+ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
581
+ Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
582
+ Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
583
+ OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
584
+ MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
585
+ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
586
+ h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
587
+ Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
588
+ JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
589
+ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
590
+ myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
591
+ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
592
+ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
593
+ -----END CERTIFICATE-----
594
+
595
+ DST Root CA X3
596
+ ==============
597
+ -----BEGIN CERTIFICATE-----
598
+ MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
599
+ ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
600
+ DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
601
+ cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
602
+ ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
603
+ rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
604
+ UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
605
+ xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
606
+ utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
607
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
608
+ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
609
+ dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
610
+ GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
611
+ RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
612
+ fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
613
+ -----END CERTIFICATE-----
614
+
615
+ SwissSign Gold CA - G2
616
+ ======================
617
+ -----BEGIN CERTIFICATE-----
618
+ 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
644
+ -----END CERTIFICATE-----
645
+
646
+ SwissSign Silver CA - G2
647
+ ========================
648
+ -----BEGIN CERTIFICATE-----
649
+ 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
675
+ -----END CERTIFICATE-----
676
+
677
+ GeoTrust Primary Certification Authority
678
+ ========================================
679
+ -----BEGIN CERTIFICATE-----
680
+ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
681
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
682
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
683
+ CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
684
+ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
685
+ CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
686
+ b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
687
+ nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
688
+ RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
689
+ tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
690
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
691
+ hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
692
+ Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
693
+ NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
694
+ Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
695
+ 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
696
+ -----END CERTIFICATE-----
697
+
698
+ thawte Primary Root CA
699
+ ======================
700
+ -----BEGIN CERTIFICATE-----
701
+ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
702
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
703
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
704
+ cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
705
+ MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
706
+ SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
707
+ KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
708
+ FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
709
+ oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
710
+ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
711
+ q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
712
+ aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
713
+ afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
714
+ VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
715
+ AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
716
+ uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
717
+ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
718
+ jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
719
+ z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
720
+ -----END CERTIFICATE-----
721
+
722
+ VeriSign Class 3 Public Primary Certification Authority - G5
723
+ ============================================================
724
+ -----BEGIN CERTIFICATE-----
725
+ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
726
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
727
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
728
+ IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
729
+ ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
730
+ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
731
+ biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
732
+ dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
733
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
734
+ ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
735
+ j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
736
+ Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
737
+ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
738
+ fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
739
+ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
740
+ Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
741
+ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
742
+ SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
743
+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
744
+ KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
745
+ Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
746
+ ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
747
+ -----END CERTIFICATE-----
748
+
749
+ SecureTrust CA
750
+ ==============
751
+ -----BEGIN CERTIFICATE-----
752
+ MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
753
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
754
+ dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
755
+ BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
756
+ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
757
+ OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
758
+ DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
759
+ GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
760
+ 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
761
+ ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
762
+ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
763
+ aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
764
+ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
765
+ SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
766
+ mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
767
+ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
768
+ 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
769
+ -----END CERTIFICATE-----
770
+
771
+ Secure Global CA
772
+ ================
773
+ -----BEGIN CERTIFICATE-----
774
+ MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
775
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
776
+ bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
777
+ MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
778
+ Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
779
+ YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
780
+ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
781
+ 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
782
+ HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
783
+ 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
784
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
785
+ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
786
+ MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
787
+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
788
+ CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
789
+ 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
790
+ f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
791
+ -----END CERTIFICATE-----
792
+
793
+ COMODO Certification Authority
794
+ ==============================
795
+ -----BEGIN CERTIFICATE-----
796
+ MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
797
+ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
798
+ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
799
+ dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
800
+ MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
801
+ T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
802
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
803
+ +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
804
+ xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
805
+ 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
806
+ 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
807
+ rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
808
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
809
+ b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
810
+ AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
811
+ OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
812
+ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
813
+ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
814
+ +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
815
+ -----END CERTIFICATE-----
816
+
817
+ Network Solutions Certificate Authority
818
+ =======================================
819
+ -----BEGIN CERTIFICATE-----
820
+ MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
821
+ EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
822
+ IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
823
+ MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
824
+ MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
825
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
826
+ jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
827
+ aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
828
+ crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
829
+ /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
830
+ AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
831
+ BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
832
+ bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
833
+ A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
834
+ 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
835
+ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
836
+ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
837
+ ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
838
+ -----END CERTIFICATE-----
839
+
840
+ COMODO ECC Certification Authority
841
+ ==================================
842
+ -----BEGIN CERTIFICATE-----
843
+ MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
844
+ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
845
+ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
846
+ dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
847
+ GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
848
+ Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
849
+ b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
850
+ 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
851
+ wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
852
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
853
+ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
854
+ U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
855
+ -----END CERTIFICATE-----
856
+
857
+ OISTE WISeKey Global Root GA CA
858
+ ===============================
859
+ -----BEGIN CERTIFICATE-----
860
+ MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
861
+ BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
862
+ A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
863
+ bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
864
+ VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
865
+ IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
866
+ IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
867
+ Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
868
+ Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
869
+ d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
870
+ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
871
+ LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
872
+ AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
873
+ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
874
+ MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
875
+ +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
876
+ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
877
+ okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
878
+ -----END CERTIFICATE-----
879
+
880
+ Certigna
881
+ ========
882
+ -----BEGIN CERTIFICATE-----
883
+ MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
884
+ EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
885
+ MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
886
+ Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
887
+ XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
888
+ GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
889
+ ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
890
+ DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
891
+ Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
892
+ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
893
+ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
894
+ SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
895
+ hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
896
+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
897
+ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
898
+ 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
899
+ WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
900
+ -----END CERTIFICATE-----
901
+
902
+ Cybertrust Global Root
903
+ ======================
904
+ -----BEGIN CERTIFICATE-----
905
+ MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
906
+ ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
907
+ MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
908
+ ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
909
+ +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
910
+ 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
911
+ AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
912
+ 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
913
+ 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
914
+ BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
915
+ MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
916
+ A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
917
+ lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
918
+ 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
919
+ hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
920
+ X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
921
+ WL1WMRJOEcgh4LMRkWXbtKaIOM5V
922
+ -----END CERTIFICATE-----
923
+
924
+ ePKI Root Certification Authority
925
+ =================================
926
+ -----BEGIN CERTIFICATE-----
927
+ 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
953
+ -----END CERTIFICATE-----
954
+
955
+ certSIGN ROOT CA
956
+ ================
957
+ -----BEGIN CERTIFICATE-----
958
+ MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
959
+ VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
960
+ Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
961
+ CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
962
+ JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
963
+ rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
964
+ ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
965
+ 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
966
+ AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
967
+ Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
968
+ AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
969
+ SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
970
+ x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
971
+ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
972
+ TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
973
+ -----END CERTIFICATE-----
974
+
975
+ GeoTrust Primary Certification Authority - G3
976
+ =============================================
977
+ -----BEGIN CERTIFICATE-----
978
+ MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
979
+ BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
980
+ IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
981
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
982
+ NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
983
+ YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
984
+ LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
985
+ hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
986
+ K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
987
+ c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
988
+ IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
989
+ dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
990
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
991
+ 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
992
+ cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
993
+ Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
994
+ AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
995
+ t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
996
+ -----END CERTIFICATE-----
997
+
998
+ thawte Primary Root CA - G2
999
+ ===========================
1000
+ -----BEGIN CERTIFICATE-----
1001
+ MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
1002
+ VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
1003
+ IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
1004
+ Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
1005
+ MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
1006
+ b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
1007
+ IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
1008
+ LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
1009
+ 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
1010
+ mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
1011
+ G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
1012
+ rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
1013
+ -----END CERTIFICATE-----
1014
+
1015
+ thawte Primary Root CA - G3
1016
+ ===========================
1017
+ -----BEGIN CERTIFICATE-----
1018
+ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
1019
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
1020
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
1021
+ cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
1022
+ ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
1023
+ d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
1024
+ VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
1025
+ A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
1026
+ MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
1027
+ P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
1028
+ +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
1029
+ 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
1030
+ vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
1031
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
1032
+ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
1033
+ A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
1034
+ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
1035
+ 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
1036
+ er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
1037
+ -----END CERTIFICATE-----
1038
+
1039
+ GeoTrust Primary Certification Authority - G2
1040
+ =============================================
1041
+ -----BEGIN CERTIFICATE-----
1042
+ MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
1043
+ VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
1044
+ Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
1045
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
1046
+ OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
1047
+ MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
1048
+ b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
1049
+ BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
1050
+ KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
1051
+ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
1052
+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
1053
+ ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
1054
+ npaqBA+K
1055
+ -----END CERTIFICATE-----
1056
+
1057
+ VeriSign Universal Root Certification Authority
1058
+ ===============================================
1059
+ -----BEGIN CERTIFICATE-----
1060
+ MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
1061
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
1062
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
1063
+ IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
1064
+ IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
1065
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
1066
+ cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
1067
+ IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
1068
+ aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
1069
+ 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
1070
+ MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
1071
+ 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
1072
+ AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
1073
+ tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
1074
+ CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
1075
+ a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
1076
+ DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
1077
+ Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
1078
+ Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
1079
+ P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
1080
+ wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
1081
+ mJO37M2CYfE45k+XmCpajQ==
1082
+ -----END CERTIFICATE-----
1083
+
1084
+ VeriSign Class 3 Public Primary Certification Authority - G4
1085
+ ============================================================
1086
+ -----BEGIN CERTIFICATE-----
1087
+ MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
1088
+ VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
1089
+ b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
1090
+ ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
1091
+ YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
1092
+ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
1093
+ cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
1094
+ b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
1095
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
1096
+ Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
1097
+ rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
1098
+ /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
1099
+ HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
1100
+ Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
1101
+ A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
1102
+ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
1103
+ -----END CERTIFICATE-----
1104
+
1105
+ NetLock Arany (Class Gold) Főtanúsítvány
1106
+ ========================================
1107
+ -----BEGIN CERTIFICATE-----
1108
+ MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
1109
+ A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
1110
+ dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
1111
+ cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
1112
+ MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
1113
+ ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
1114
+ biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
1115
+ c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
1116
+ 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
1117
+ /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
1118
+ H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
1119
+ fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
1120
+ neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
1121
+ BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
1122
+ qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
1123
+ YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
1124
+ bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
1125
+ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
1126
+ dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
1127
+ -----END CERTIFICATE-----
1128
+
1129
+ Staat der Nederlanden Root CA - G2
1130
+ ==================================
1131
+ -----BEGIN CERTIFICATE-----
1132
+ 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
1158
+ 66+KAQ==
1159
+ -----END CERTIFICATE-----
1160
+
1161
+ Hongkong Post Root CA 1
1162
+ =======================
1163
+ -----BEGIN CERTIFICATE-----
1164
+ MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
1165
+ DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
1166
+ NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
1167
+ IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
1168
+ AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
1169
+ ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
1170
+ auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
1171
+ qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
1172
+ V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
1173
+ HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
1174
+ h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
1175
+ l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
1176
+ IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
1177
+ T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
1178
+ c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
1179
+ -----END CERTIFICATE-----
1180
+
1181
+ SecureSign RootCA11
1182
+ ===================
1183
+ -----BEGIN CERTIFICATE-----
1184
+ MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
1185
+ SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
1186
+ b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
1187
+ KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
1188
+ cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
1189
+ TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
1190
+ wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
1191
+ g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
1192
+ O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
1193
+ bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
1194
+ t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
1195
+ OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
1196
+ bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
1197
+ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
1198
+ y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
1199
+ lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
1200
+ -----END CERTIFICATE-----
1201
+
1202
+ Microsec e-Szigno Root CA 2009
1203
+ ==============================
1204
+ -----BEGIN CERTIFICATE-----
1205
+ MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
1206
+ MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
1207
+ c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
1208
+ dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
1209
+ BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
1210
+ U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
1211
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
1212
+ fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
1213
+ 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
1214
+ pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
1215
+ 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
1216
+ AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
1217
+ QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
1218
+ FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
1219
+ lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
1220
+ I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
1221
+ tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
1222
+ yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
1223
+ LXpUq3DDfSJlgnCW
1224
+ -----END CERTIFICATE-----
1225
+
1226
+ GlobalSign Root CA - R3
1227
+ =======================
1228
+ -----BEGIN CERTIFICATE-----
1229
+ MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
1230
+ YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
1231
+ bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
1232
+ aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
1233
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
1234
+ iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
1235
+ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
1236
+ rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
1237
+ OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
1238
+ xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
1239
+ FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
1240
+ lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
1241
+ EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
1242
+ bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
1243
+ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
1244
+ kpeDMdmztcpHWD9f
1245
+ -----END CERTIFICATE-----
1246
+
1247
+ Autoridad de Certificacion Firmaprofesional CIF A62634068
1248
+ =========================================================
1249
+ -----BEGIN CERTIFICATE-----
1250
+ MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
1251
+ BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
1252
+ MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
1253
+ QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
1254
+ NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
1255
+ Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
1256
+ B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
1257
+ 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
1258
+ ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
1259
+ plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
1260
+ MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
1261
+ LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
1262
+ bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
1263
+ vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
1264
+ EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
1265
+ DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
1266
+ cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
1267
+ bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
1268
+ ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
1269
+ 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
1270
+ R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
1271
+ T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
1272
+ Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
1273
+ osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
1274
+ crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
1275
+ saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
1276
+ KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
1277
+ 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
1278
+ -----END CERTIFICATE-----
1279
+
1280
+ Izenpe.com
1281
+ ==========
1282
+ -----BEGIN CERTIFICATE-----
1283
+ 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
1310
+ -----END CERTIFICATE-----
1311
+
1312
+ Chambers of Commerce Root - 2008
1313
+ ================================
1314
+ -----BEGIN CERTIFICATE-----
1315
+ MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
1316
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
1317
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
1318
+ QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
1319
+ Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
1320
+ ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
1321
+ EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
1322
+ cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
1323
+ AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
1324
+ XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
1325
+ h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
1326
+ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
1327
+ NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
1328
+ D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
1329
+ lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
1330
+ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
1331
+ ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
1332
+ EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
1333
+ G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
1334
+ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
1335
+ bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
1336
+ bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
1337
+ CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
1338
+ AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
1339
+ wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
1340
+ 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
1341
+ RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
1342
+ M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
1343
+ YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
1344
+ 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
1345
+ zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
1346
+ nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
1347
+ OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
1348
+ -----END CERTIFICATE-----
1349
+
1350
+ Global Chambersign Root - 2008
1351
+ ==============================
1352
+ -----BEGIN CERTIFICATE-----
1353
+ MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
1354
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
1355
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
1356
+ QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
1357
+ NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
1358
+ Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
1359
+ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
1360
+ aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
1361
+ VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
1362
+ XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
1363
+ ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
1364
+ /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
1365
+ TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
1366
+ H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
1367
+ Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
1368
+ HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
1369
+ wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
1370
+ AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
1371
+ BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
1372
+ BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
1373
+ aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
1374
+ aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
1375
+ 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
1376
+ dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
1377
+ /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
1378
+ ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
1379
+ dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
1380
+ 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
1381
+ foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
1382
+ qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
1383
+ P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
1384
+ c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
1385
+ 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
1386
+ -----END CERTIFICATE-----
1387
+
1388
+ Go Daddy Root Certificate Authority - G2
1389
+ ========================================
1390
+ -----BEGIN CERTIFICATE-----
1391
+ MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
1392
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
1393
+ MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
1394
+ MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
1395
+ b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
1396
+ A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
1397
+ hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
1398
+ 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
1399
+ +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
1400
+ fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
1401
+ NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
1402
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
1403
+ BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
1404
+ vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
1405
+ 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
1406
+ N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
1407
+ LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
1408
+ -----END CERTIFICATE-----
1409
+
1410
+ Starfield Root Certificate Authority - G2
1411
+ =========================================
1412
+ -----BEGIN CERTIFICATE-----
1413
+ MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
1414
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
1415
+ b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
1416
+ eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
1417
+ DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
1418
+ VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
1419
+ dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
1420
+ W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
1421
+ bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
1422
+ N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
1423
+ ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
1424
+ JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1425
+ AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
1426
+ TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
1427
+ 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
1428
+ F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
1429
+ pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
1430
+ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
1431
+ -----END CERTIFICATE-----
1432
+
1433
+ Starfield Services Root Certificate Authority - G2
1434
+ ==================================================
1435
+ -----BEGIN CERTIFICATE-----
1436
+ MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
1437
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
1438
+ b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
1439
+ IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
1440
+ BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
1441
+ dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
1442
+ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
1443
+ AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
1444
+ h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
1445
+ hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
1446
+ LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
1447
+ rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
1448
+ AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
1449
+ SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
1450
+ E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
1451
+ xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
1452
+ iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
1453
+ YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
1454
+ -----END CERTIFICATE-----
1455
+
1456
+ AffirmTrust Commercial
1457
+ ======================
1458
+ -----BEGIN CERTIFICATE-----
1459
+ MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
1460
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
1461
+ MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
1462
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
1463
+ AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
1464
+ DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
1465
+ C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
1466
+ BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
1467
+ MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
1468
+ HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1469
+ AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
1470
+ hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
1471
+ qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
1472
+ 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
1473
+ sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
1474
+ -----END CERTIFICATE-----
1475
+
1476
+ AffirmTrust Networking
1477
+ ======================
1478
+ -----BEGIN CERTIFICATE-----
1479
+ MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
1480
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
1481
+ MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
1482
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
1483
+ AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
1484
+ Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
1485
+ dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
1486
+ /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
1487
+ h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
1488
+ HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1489
+ AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
1490
+ UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
1491
+ 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
1492
+ WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
1493
+ /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
1494
+ -----END CERTIFICATE-----
1495
+
1496
+ AffirmTrust Premium
1497
+ ===================
1498
+ -----BEGIN CERTIFICATE-----
1499
+ MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
1500
+ BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
1501
+ OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
1502
+ dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
1503
+ MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
1504
+ BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
1505
+ 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
1506
+ +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
1507
+ GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
1508
+ p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
1509
+ S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
1510
+ 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
1511
+ /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
1512
+ +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
1513
+ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
1514
+ MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
1515
+ Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
1516
+ 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
1517
+ L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
1518
+ +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
1519
+ BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
1520
+ IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
1521
+ g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
1522
+ zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
1523
+ -----END CERTIFICATE-----
1524
+
1525
+ AffirmTrust Premium ECC
1526
+ =======================
1527
+ -----BEGIN CERTIFICATE-----
1528
+ MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
1529
+ BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
1530
+ MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
1531
+ cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
1532
+ IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
1533
+ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
1534
+ BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
1535
+ BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
1536
+ 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
1537
+ eQ==
1538
+ -----END CERTIFICATE-----
1539
+
1540
+ Certum Trusted Network CA
1541
+ =========================
1542
+ -----BEGIN CERTIFICATE-----
1543
+ MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
1544
+ ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
1545
+ biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
1546
+ MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
1547
+ ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
1548
+ MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
1549
+ AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
1550
+ l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
1551
+ J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
1552
+ fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
1553
+ cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
1554
+ Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
1555
+ DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
1556
+ jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
1557
+ mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
1558
+ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
1559
+ 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
1560
+ -----END CERTIFICATE-----
1561
+
1562
+ TWCA Root Certification Authority
1563
+ =================================
1564
+ -----BEGIN CERTIFICATE-----
1565
+ MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
1566
+ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
1567
+ dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
1568
+ EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
1569
+ IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
1570
+ AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
1571
+ QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
1572
+ oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
1573
+ 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
1574
+ y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
1575
+ BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
1576
+ 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
1577
+ mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
1578
+ QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
1579
+ T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
1580
+ Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
1581
+ -----END CERTIFICATE-----
1582
+
1583
+ Security Communication RootCA2
1584
+ ==============================
1585
+ -----BEGIN CERTIFICATE-----
1586
+ MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
1587
+ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
1588
+ dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
1589
+ SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
1590
+ aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
1591
+ ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
1592
+ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
1593
+ 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
1594
+ spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
1595
+ EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
1596
+ QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
1597
+ CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
1598
+ u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
1599
+ 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
1600
+ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
1601
+ mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
1602
+ -----END CERTIFICATE-----
1603
+
1604
+ EC-ACC
1605
+ ======
1606
+ -----BEGIN CERTIFICATE-----
1607
+ MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
1608
+ BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
1609
+ ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
1610
+ VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
1611
+ CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
1612
+ BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
1613
+ MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
1614
+ SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
1615
+ Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
1616
+ cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
1617
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
1618
+ w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
1619
+ ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
1620
+ HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
1621
+ E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
1622
+ 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
1623
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
1624
+ VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
1625
+ Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
1626
+ dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
1627
+ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
1628
+ Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
1629
+ l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
1630
+ E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
1631
+ 5EI=
1632
+ -----END CERTIFICATE-----
1633
+
1634
+ Hellenic Academic and Research Institutions RootCA 2011
1635
+ =======================================================
1636
+ -----BEGIN CERTIFICATE-----
1637
+ MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
1638
+ O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
1639
+ aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
1640
+ IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
1641
+ AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
1642
+ IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
1643
+ IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
1644
+ AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
1645
+ 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
1646
+ 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
1647
+ 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
1648
+ 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
1649
+ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
1650
+ MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
1651
+ b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
1652
+ XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
1653
+ TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
1654
+ /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
1655
+ 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
1656
+ -----END CERTIFICATE-----
1657
+
1658
+ Actalis Authentication Root CA
1659
+ ==============================
1660
+ -----BEGIN CERTIFICATE-----
1661
+ MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
1662
+ BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
1663
+ AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
1664
+ MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
1665
+ IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
1666
+ IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
1667
+ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
1668
+ by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
1669
+ zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
1670
+ YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
1671
+ oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
1672
+ EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
1673
+ hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
1674
+ EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
1675
+ jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
1676
+ iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
1677
+ ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
1678
+ WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
1679
+ JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
1680
+ K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
1681
+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
1682
+ 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
1683
+ 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
1684
+ lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
1685
+ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
1686
+ vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
1687
+ -----END CERTIFICATE-----
1688
+
1689
+ Trustis FPS Root CA
1690
+ ===================
1691
+ -----BEGIN CERTIFICATE-----
1692
+ MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
1693
+ EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
1694
+ IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
1695
+ BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
1696
+ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
1697
+ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
1698
+ H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
1699
+ cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
1700
+ o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
1701
+ AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
1702
+ BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
1703
+ GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
1704
+ yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
1705
+ 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
1706
+ l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
1707
+ iB6XzCGcKQENZetX2fNXlrtIzYE=
1708
+ -----END CERTIFICATE-----
1709
+
1710
+ Buypass Class 2 Root CA
1711
+ =======================
1712
+ -----BEGIN CERTIFICATE-----
1713
+ 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
1737
+ rJgWVqA=
1738
+ -----END CERTIFICATE-----
1739
+
1740
+ Buypass Class 3 Root CA
1741
+ =======================
1742
+ -----BEGIN CERTIFICATE-----
1743
+ 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
1767
+ Cp/HuZc=
1768
+ -----END CERTIFICATE-----
1769
+
1770
+ T-TeleSec GlobalRoot Class 3
1771
+ ============================
1772
+ -----BEGIN CERTIFICATE-----
1773
+ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
1774
+ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
1775
+ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
1776
+ MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
1777
+ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
1778
+ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
1779
+ DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
1780
+ 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
1781
+ NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
1782
+ iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
1783
+ 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
1784
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
1785
+ AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
1786
+ fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
1787
+ ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
1788
+ P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
1789
+ e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
1790
+ -----END CERTIFICATE-----
1791
+
1792
+ EE Certification Centre Root CA
1793
+ ===============================
1794
+ -----BEGIN CERTIFICATE-----
1795
+ MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
1796
+ EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
1797
+ dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
1798
+ MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
1799
+ UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
1800
+ ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
1801
+ DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
1802
+ TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
1803
+ rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
1804
+ 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
1805
+ P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
1806
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
1807
+ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
1808
+ BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
1809
+ xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
1810
+ lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
1811
+ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
1812
+ 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
1813
+ dcGWxZ0=
1814
+ -----END CERTIFICATE-----
1815
+
1816
+ D-TRUST Root Class 3 CA 2 2009
1817
+ ==============================
1818
+ -----BEGIN CERTIFICATE-----
1819
+ MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
1820
+ DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
1821
+ Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
1822
+ LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
1823
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
1824
+ ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
1825
+ BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
1826
+ KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
1827
+ p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
1828
+ AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
1829
+ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
1830
+ eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
1831
+ MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
1832
+ PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
1833
+ OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
1834
+ 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
1835
+ o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
1836
+ dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
1837
+ X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
1838
+ -----END CERTIFICATE-----
1839
+
1840
+ D-TRUST Root Class 3 CA 2 EV 2009
1841
+ =================================
1842
+ -----BEGIN CERTIFICATE-----
1843
+ MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
1844
+ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
1845
+ OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
1846
+ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
1847
+ OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
1848
+ egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
1849
+ zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
1850
+ 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
1851
+ sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
1852
+ 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
1853
+ cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
1854
+ ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
1855
+ MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
1856
+ b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
1857
+ c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
1858
+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
1859
+ nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
1860
+ ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
1861
+ NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
1862
+ w9y4AyHqnxbxLFS1
1863
+ -----END CERTIFICATE-----
1864
+
1865
+ CA Disig Root R2
1866
+ ================
1867
+ -----BEGIN CERTIFICATE-----
1868
+ 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
1892
+ 7+ZtsH8tZ/3zbBt1RqPlShfppNcL
1893
+ -----END CERTIFICATE-----
1894
+
1895
+ ACCVRAIZ1
1896
+ =========
1897
+ -----BEGIN CERTIFICATE-----
1898
+ MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
1899
+ SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
1900
+ MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
1901
+ UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
1902
+ DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
1903
+ jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
1904
+ RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
1905
+ aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
1906
+ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
1907
+ WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
1908
+ 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
1909
+ 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
1910
+ 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
1911
+ Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
1912
+ Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
1913
+ Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
1914
+ VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
1915
+ Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
1916
+ QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
1917
+ AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
1918
+ YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
1919
+ AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
1920
+ IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
1921
+ aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
1922
+ dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
1923
+ MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
1924
+ hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
1925
+ R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
1926
+ YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
1927
+ nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
1928
+ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
1929
+ sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
1930
+ I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
1931
+ Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
1932
+ 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
1933
+ EfbRD0tVNEYqi4Y7
1934
+ -----END CERTIFICATE-----
1935
+
1936
+ TWCA Global Root CA
1937
+ ===================
1938
+ -----BEGIN CERTIFICATE-----
1939
+ MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
1940
+ CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
1941
+ QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
1942
+ EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
1943
+ Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
1944
+ nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
1945
+ r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
1946
+ Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
1947
+ tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
1948
+ KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
1949
+ sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
1950
+ yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
1951
+ kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
1952
+ zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
1953
+ AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
1954
+ cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
1955
+ LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
1956
+ 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
1957
+ /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
1958
+ lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
1959
+ A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
1960
+ i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
1961
+ EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
1962
+ zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
1963
+ -----END CERTIFICATE-----
1964
+
1965
+ TeliaSonera Root CA v1
1966
+ ======================
1967
+ -----BEGIN CERTIFICATE-----
1968
+ MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
1969
+ CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
1970
+ MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
1971
+ VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
1972
+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
1973
+ 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
1974
+ B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
1975
+ Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
1976
+ oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
1977
+ F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
1978
+ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
1979
+ gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
1980
+ TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
1981
+ AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
1982
+ DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
1983
+ zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
1984
+ 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
1985
+ pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
1986
+ G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
1987
+ c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
1988
+ JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
1989
+ qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
1990
+ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
1991
+ WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
1992
+ -----END CERTIFICATE-----
1993
+
1994
+ E-Tugra Certification Authority
1995
+ ===============================
1996
+ -----BEGIN CERTIFICATE-----
1997
+ MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
1998
+ DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
1999
+ ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
2000
+ ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
2001
+ NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
2002
+ QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
2003
+ cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
2004
+ DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
2005
+ MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
2006
+ hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
2007
+ CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
2008
+ ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
2009
+ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
2010
+ E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
2011
+ rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
2012
+ jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
2013
+ rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
2014
+ dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
2015
+ /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
2016
+ MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
2017
+ kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
2018
+ XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
2019
+ VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
2020
+ a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
2021
+ dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
2022
+ KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
2023
+ Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
2024
+ 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
2025
+ C7TbO6Orb1wdtn7os4I07QZcJA==
2026
+ -----END CERTIFICATE-----
2027
+
2028
+ T-TeleSec GlobalRoot Class 2
2029
+ ============================
2030
+ -----BEGIN CERTIFICATE-----
2031
+ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
2032
+ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
2033
+ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
2034
+ MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
2035
+ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
2036
+ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
2037
+ DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
2038
+ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
2039
+ vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
2040
+ 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
2041
+ WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
2042
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
2043
+ YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
2044
+ r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
2045
+ vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
2046
+ 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
2047
+ 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
2048
+ -----END CERTIFICATE-----
2049
+
2050
+ Atos TrustedRoot 2011
2051
+ =====================
2052
+ -----BEGIN CERTIFICATE-----
2053
+ MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
2054
+ cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
2055
+ MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
2056
+ A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
2057
+ hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
2058
+ 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
2059
+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
2060
+ HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
2061
+ z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
2062
+ l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
2063
+ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
2064
+ CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
2065
+ k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
2066
+ TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
2067
+ 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
2068
+ 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
2069
+ -----END CERTIFICATE-----
2070
+
2071
+ QuoVadis Root CA 1 G3
2072
+ =====================
2073
+ -----BEGIN CERTIFICATE-----
2074
+ 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
2098
+ hMJKzRwuJIczYOXD
2099
+ -----END CERTIFICATE-----
2100
+
2101
+ QuoVadis Root CA 2 G3
2102
+ =====================
2103
+ -----BEGIN CERTIFICATE-----
2104
+ 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
2128
+ O3jtZsSOeWmD3n+M
2129
+ -----END CERTIFICATE-----
2130
+
2131
+ QuoVadis Root CA 3 G3
2132
+ =====================
2133
+ -----BEGIN CERTIFICATE-----
2134
+ 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
2158
+ PpxxVJkES/1Y+Zj0
2159
+ -----END CERTIFICATE-----
2160
+
2161
+ DigiCert Assured ID Root G2
2162
+ ===========================
2163
+ -----BEGIN CERTIFICATE-----
2164
+ MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
2165
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
2166
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
2167
+ MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
2168
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
2169
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
2170
+ 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
2171
+ bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
2172
+ VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
2173
+ YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
2174
+ lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
2175
+ w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
2176
+ 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
2177
+ d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
2178
+ hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
2179
+ jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
2180
+ IhNzbM8m9Yop5w==
2181
+ -----END CERTIFICATE-----
2182
+
2183
+ DigiCert Assured ID Root G3
2184
+ ===========================
2185
+ -----BEGIN CERTIFICATE-----
2186
+ MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
2187
+ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
2188
+ VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
2189
+ MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
2190
+ d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
2191
+ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
2192
+ RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
2193
+ KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
2194
+ UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
2195
+ YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
2196
+ 1vUhZscv6pZjamVFkpUBtA==
2197
+ -----END CERTIFICATE-----
2198
+
2199
+ DigiCert Global Root G2
2200
+ =======================
2201
+ -----BEGIN CERTIFICATE-----
2202
+ MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
2203
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
2204
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
2205
+ MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
2206
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
2207
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
2208
+ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
2209
+ 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
2210
+ BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
2211
+ UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
2212
+ o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
2213
+ 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
2214
+ F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
2215
+ WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
2216
+ QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
2217
+ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
2218
+ MrY=
2219
+ -----END CERTIFICATE-----
2220
+
2221
+ DigiCert Global Root G3
2222
+ =======================
2223
+ -----BEGIN CERTIFICATE-----
2224
+ MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
2225
+ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
2226
+ VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
2227
+ MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
2228
+ aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
2229
+ AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
2230
+ YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
2231
+ BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
2232
+ Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
2233
+ 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
2234
+ VOKa5Vt8sycX
2235
+ -----END CERTIFICATE-----
2236
+
2237
+ DigiCert Trusted Root G4
2238
+ ========================
2239
+ -----BEGIN CERTIFICATE-----
2240
+ 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
2265
+ 82Z+
2266
+ -----END CERTIFICATE-----
2267
+
2268
+ COMODO RSA Certification Authority
2269
+ ==================================
2270
+ -----BEGIN CERTIFICATE-----
2271
+ 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
2297
+ LaZRfyHBNVOFBkpdn627G190
2298
+ -----END CERTIFICATE-----
2299
+
2300
+ USERTrust RSA Certification Authority
2301
+ =====================================
2302
+ -----BEGIN CERTIFICATE-----
2303
+ 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
2329
+ Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
2330
+ -----END CERTIFICATE-----
2331
+
2332
+ USERTrust ECC Certification Authority
2333
+ =====================================
2334
+ -----BEGIN CERTIFICATE-----
2335
+ MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
2336
+ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
2337
+ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
2338
+ biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
2339
+ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
2340
+ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
2341
+ biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
2342
+ 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
2343
+ nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
2344
+ HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
2345
+ HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
2346
+ 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
2347
+ -----END CERTIFICATE-----
2348
+
2349
+ GlobalSign ECC Root CA - R4
2350
+ ===========================
2351
+ -----BEGIN CERTIFICATE-----
2352
+ MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
2353
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
2354
+ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
2355
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
2356
+ EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
2357
+ OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
2358
+ AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
2359
+ MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
2360
+ JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
2361
+ -----END CERTIFICATE-----
2362
+
2363
+ GlobalSign ECC Root CA - R5
2364
+ ===========================
2365
+ -----BEGIN CERTIFICATE-----
2366
+ MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
2367
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
2368
+ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
2369
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
2370
+ EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
2371
+ SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
2372
+ h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
2373
+ BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
2374
+ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
2375
+ yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
2376
+ -----END CERTIFICATE-----
2377
+
2378
+ Staat der Nederlanden Root CA - G3
2379
+ ==================================
2380
+ -----BEGIN CERTIFICATE-----
2381
+ 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
2406
+ -----END CERTIFICATE-----
2407
+
2408
+ Staat der Nederlanden EV Root CA
2409
+ ================================
2410
+ -----BEGIN CERTIFICATE-----
2411
+ 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
2435
+ eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
2436
+ -----END CERTIFICATE-----
2437
+
2438
+ IdenTrust Commercial Root CA 1
2439
+ ==============================
2440
+ -----BEGIN CERTIFICATE-----
2441
+ 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
2465
+ cGzM7vRX+Bi6hG6H
2466
+ -----END CERTIFICATE-----
2467
+
2468
+ IdenTrust Public Sector Root CA 1
2469
+ =================================
2470
+ -----BEGIN CERTIFICATE-----
2471
+ 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
2495
+ 3Wl9af0AVqW3rLatt8o+Ae+c
2496
+ -----END CERTIFICATE-----
2497
+
2498
+ Entrust Root Certification Authority - G2
2499
+ =========================================
2500
+ -----BEGIN CERTIFICATE-----
2501
+ MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
2502
+ BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
2503
+ bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
2504
+ b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
2505
+ HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
2506
+ DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
2507
+ OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
2508
+ eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
2509
+ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
2510
+ /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
2511
+ HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
2512
+ s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
2513
+ TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
2514
+ AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
2515
+ 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
2516
+ iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
2517
+ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
2518
+ nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
2519
+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
2520
+ e4pIb4tF9g==
2521
+ -----END CERTIFICATE-----
2522
+
2523
+ Entrust Root Certification Authority - EC1
2524
+ ==========================================
2525
+ -----BEGIN CERTIFICATE-----
2526
+ MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
2527
+ FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
2528
+ YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
2529
+ ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
2530
+ IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
2531
+ FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
2532
+ LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
2533
+ dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
2534
+ IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
2535
+ AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
2536
+ 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
2537
+ FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
2538
+ vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
2539
+ kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
2540
+ -----END CERTIFICATE-----
2541
+
2542
+ CFCA EV ROOT
2543
+ ============
2544
+ -----BEGIN CERTIFICATE-----
2545
+ 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
2570
+ -----END CERTIFICATE-----
2571
+
2572
+ OISTE WISeKey Global Root GB CA
2573
+ ===============================
2574
+ -----BEGIN CERTIFICATE-----
2575
+ MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
2576
+ EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
2577
+ ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
2578
+ MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
2579
+ VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
2580
+ b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
2581
+ scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
2582
+ rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
2583
+ 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
2584
+ Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
2585
+ GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
2586
+ /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
2587
+ hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
2588
+ dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
2589
+ VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
2590
+ HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
2591
+ Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
2592
+ -----END CERTIFICATE-----
2593
+
2594
+ SZAFIR ROOT CA2
2595
+ ===============
2596
+ -----BEGIN CERTIFICATE-----
2597
+ MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
2598
+ A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
2599
+ BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
2600
+ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
2601
+ VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
2602
+ qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
2603
+ DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
2604
+ 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
2605
+ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
2606
+ ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
2607
+ AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
2608
+ AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
2609
+ O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
2610
+ oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
2611
+ 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
2612
+ +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
2613
+ -----END CERTIFICATE-----
2614
+
2615
+ Certum Trusted Network CA 2
2616
+ ===========================
2617
+ -----BEGIN CERTIFICATE-----
2618
+ MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
2619
+ BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
2620
+ bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
2621
+ ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
2622
+ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
2623
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
2624
+ IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
2625
+ 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
2626
+ CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
2627
+ Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
2628
+ uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
2629
+ GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
2630
+ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
2631
+ Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
2632
+ hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
2633
+ BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
2634
+ AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
2635
+ hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
2636
+ Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
2637
+ L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
2638
+ clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
2639
+ pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
2640
+ w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
2641
+ J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
2642
+ ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
2643
+ is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
2644
+ zAYspsbiDrW5viSP
2645
+ -----END CERTIFICATE-----
2646
+
2647
+ Hellenic Academic and Research Institutions RootCA 2015
2648
+ =======================================================
2649
+ -----BEGIN CERTIFICATE-----
2650
+ MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
2651
+ BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
2652
+ aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
2653
+ YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
2654
+ MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
2655
+ QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
2656
+ BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
2657
+ MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
2658
+ bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
2659
+ iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
2660
+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
2661
+ FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
2662
+ i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
2663
+ GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
2664
+ fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
2665
+ iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
2666
+ Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
2667
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
2668
+ hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
2669
+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
2670
+ d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
2671
+ d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
2672
+ 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
2673
+ davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
2674
+ Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
2675
+ J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
2676
+ JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
2677
+ p/UsQu0yrbYhnr68
2678
+ -----END CERTIFICATE-----
2679
+
2680
+ Hellenic Academic and Research Institutions ECC RootCA 2015
2681
+ ===========================================================
2682
+ -----BEGIN CERTIFICATE-----
2683
+ MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
2684
+ aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
2685
+ cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
2686
+ aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
2687
+ MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
2688
+ IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
2689
+ VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
2690
+ Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
2691
+ dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
2692
+ Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
2693
+ BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
2694
+ GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
2695
+ dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
2696
+ -----END CERTIFICATE-----
2697
+
2698
+ ISRG Root X1
2699
+ ============
2700
+ -----BEGIN CERTIFICATE-----
2701
+ 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
2725
+ m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
2726
+ -----END CERTIFICATE-----
2727
+
2728
+ AC RAIZ FNMT-RCM
2729
+ ================
2730
+ -----BEGIN CERTIFICATE-----
2731
+ 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
2756
+ -----END CERTIFICATE-----
2757
+
2758
+ Amazon Root CA 1
2759
+ ================
2760
+ -----BEGIN CERTIFICATE-----
2761
+ MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
2762
+ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
2763
+ MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
2764
+ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
2765
+ ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
2766
+ FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
2767
+ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
2768
+ dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
2769
+ VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
2770
+ /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
2771
+ DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
2772
+ CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
2773
+ 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
2774
+ 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
2775
+ xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
2776
+ -----END CERTIFICATE-----
2777
+
2778
+ Amazon Root CA 2
2779
+ ================
2780
+ -----BEGIN CERTIFICATE-----
2781
+ MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
2782
+ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
2783
+ MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
2784
+ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
2785
+ ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
2786
+ kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
2787
+ N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
2788
+ AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
2789
+ fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
2790
+ kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
2791
+ btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
2792
+ Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
2793
+ c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
2794
+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
2795
+ DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
2796
+ A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
2797
+ +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
2798
+ YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
2799
+ xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
2800
+ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
2801
+ aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
2802
+ Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
2803
+ KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
2804
+ JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
2805
+ -----END CERTIFICATE-----
2806
+
2807
+ Amazon Root CA 3
2808
+ ================
2809
+ -----BEGIN CERTIFICATE-----
2810
+ MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
2811
+ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
2812
+ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
2813
+ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
2814
+ f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
2815
+ Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
2816
+ rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
2817
+ eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
2818
+ -----END CERTIFICATE-----
2819
+
2820
+ Amazon Root CA 4
2821
+ ================
2822
+ -----BEGIN CERTIFICATE-----
2823
+ MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
2824
+ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
2825
+ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
2826
+ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
2827
+ /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
2828
+ 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
2829
+ HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
2830
+ MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
2831
+ AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
2832
+ -----END CERTIFICATE-----
2833
+
2834
+ LuxTrust Global Root 2
2835
+ ======================
2836
+ -----BEGIN CERTIFICATE-----
2837
+ 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
2863
+ -----END CERTIFICATE-----
2864
+
2865
+ TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
2866
+ =============================================
2867
+ -----BEGIN CERTIFICATE-----
2868
+ MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
2869
+ D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
2870
+ IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
2871
+ TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
2872
+ ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
2873
+ VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
2874
+ c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
2875
+ bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
2876
+ IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
2877
+ MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
2878
+ 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
2879
+ wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
2880
+ 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
2881
+ WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
2882
+ ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
2883
+ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
2884
+ AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
2885
+ lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
2886
+ e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
2887
+ q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
2888
+ -----END CERTIFICATE-----
2889
+
2890
+ GDCA TrustAUTH R5 ROOT
2891
+ ======================
2892
+ -----BEGIN CERTIFICATE-----
2893
+ MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw
2894
+ BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD
2895
+ DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow
2896
+ YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
2897
+ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B
2898
+ AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs
2899
+ AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p
2900
+ OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr
2901
+ pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ
2902
+ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ
2903
+ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM
2904
+ R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ
2905
+ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4
2906
+ oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx
2907
+ 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR
2908
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
2909
+ p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9
2910
+ H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35
2911
+ 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd
2912
+ +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ
2913
+ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD
2914
+ F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ
2915
+ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv
2916
+ /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT
2917
+ aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
2918
+ -----END CERTIFICATE-----
2919
+
2920
+ TrustCor RootCert CA-1
2921
+ ======================
2922
+ -----BEGIN CERTIFICATE-----
2923
+ MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP
2924
+ MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
2925
+ U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
2926
+ dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx
2927
+ MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu
2928
+ YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe
2929
+ VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy
2930
+ dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq
2931
+ jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4
2932
+ pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0
2933
+ JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h
2934
+ gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw
2935
+ /Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j
2936
+ BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2937
+ AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5
2938
+ mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
2939
+ ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C
2940
+ qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P
2941
+ 3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=
2942
+ -----END CERTIFICATE-----
2943
+
2944
+ TrustCor RootCert CA-2
2945
+ ======================
2946
+ -----BEGIN CERTIFICATE-----
2947
+ MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w
2948
+ DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT
2949
+ eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0
2950
+ eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy
2951
+ MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h
2952
+ bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
2953
+ cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0
2954
+ IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb
2955
+ ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk
2956
+ RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1
2957
+ oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb
2958
+ XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1
2959
+ /p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q
2960
+ jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP
2961
+ eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg
2962
+ rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
2963
+ 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU
2964
+ 2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD
2965
+ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h
2966
+ Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp
2967
+ kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv
2968
+ 2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3
2969
+ S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw
2970
+ PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv
2971
+ DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU
2972
+ RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE
2973
+ xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX
2974
+ RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ
2975
+ -----END CERTIFICATE-----
2976
+
2977
+ TrustCor ECA-1
2978
+ ==============
2979
+ -----BEGIN CERTIFICATE-----
2980
+ MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP
2981
+ MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
2982
+ U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
2983
+ dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw
2984
+ N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5
2985
+ MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y
2986
+ IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG
2987
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR
2988
+ MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23
2989
+ xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc
2990
+ p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+
2991
+ fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj
2992
+ YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL
2993
+ f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
2994
+ AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u
2995
+ /ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
2996
+ hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs
2997
+ J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC
2998
+ jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==
2999
+ -----END CERTIFICATE-----
3000
+
3001
+ SSL.com Root Certification Authority RSA
3002
+ ========================================
3003
+ -----BEGIN CERTIFICATE-----
3004
+ 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
3030
+ WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=
3031
+ -----END CERTIFICATE-----
3032
+
3033
+ SSL.com Root Certification Authority ECC
3034
+ ========================================
3035
+ -----BEGIN CERTIFICATE-----
3036
+ MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV
3037
+ BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv
3038
+ BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy
3039
+ MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO
3040
+ BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
3041
+ bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
3042
+ BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+
3043
+ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR
3044
+ hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT
3045
+ jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW
3046
+ e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z
3047
+ 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
3048
+ -----END CERTIFICATE-----
3049
+
3050
+ SSL.com EV Root Certification Authority RSA R2
3051
+ ==============================================
3052
+ -----BEGIN CERTIFICATE-----
3053
+ MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w
3054
+ DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u
3055
+ MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
3056
+ MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI
3057
+ DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD
3058
+ VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN
3059
+ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh
3060
+ hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w
3061
+ cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO
3062
+ Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+
3063
+ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh
3064
+ CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim
3065
+ 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto
3066
+ RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm
3067
+ JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48
3068
+ +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
3069
+ HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp
3070
+ qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1
3071
+ ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx
3072
+ Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G
3073
+ guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz
3074
+ OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7
3075
+ CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq
3076
+ lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR
3077
+ rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1
3078
+ hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX
3079
+ 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
3080
+ -----END CERTIFICATE-----
3081
+
3082
+ SSL.com EV Root Certification Authority ECC
3083
+ ===========================================
3084
+ -----BEGIN CERTIFICATE-----
3085
+ MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV
3086
+ BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy
3087
+ BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw
3088
+ MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
3089
+ EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM
3090
+ LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
3091
+ BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy
3092
+ 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O
3093
+ BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe
3094
+ 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ
3095
+ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm
3096
+ m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
3097
+ -----END CERTIFICATE-----
3098
+
3099
+ GlobalSign Root CA - R6
3100
+ =======================
3101
+ -----BEGIN CERTIFICATE-----
3102
+ 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
3127
+ -----END CERTIFICATE-----
3128
+
3129
+ OISTE WISeKey Global Root GC CA
3130
+ ===============================
3131
+ -----BEGIN CERTIFICATE-----
3132
+ MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD
3133
+ SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo
3134
+ MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa
3135
+ Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL
3136
+ ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
3137
+ bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr
3138
+ VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab
3139
+ NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
3140
+ BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E
3141
+ AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk
3142
+ AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
3143
+ -----END CERTIFICATE-----
3144
+
3145
+ GTS Root R1
3146
+ ===========
3147
+ -----BEGIN CERTIFICATE-----
3148
+ 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
3172
+ CFF1pkgl
3173
+ -----END CERTIFICATE-----
3174
+
3175
+ GTS Root R2
3176
+ ===========
3177
+ -----BEGIN CERTIFICATE-----
3178
+ MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG
3179
+ EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv
3180
+ b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG
3181
+ A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi
3182
+ MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk
3183
+ k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo
3184
+ 7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI
3185
+ m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm
3186
+ dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu
3187
+ ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz
3188
+ cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW
3189
+ Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl
3190
+ aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy
3191
+ 5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
3192
+ VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM
3193
+ BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT
3194
+ vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ
3195
+ +YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw
3196
+ c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da
3197
+ WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r
3198
+ n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu
3199
+ Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ
3200
+ 7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs
3201
+ gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld
3202
+ o/DUhgkC
3203
+ -----END CERTIFICATE-----
3204
+
3205
+ GTS Root R3
3206
+ ===========
3207
+ -----BEGIN CERTIFICATE-----
3208
+ MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV
3209
+ UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
3210
+ UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
3211
+ ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq
3212
+ hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU
3213
+ Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej
3214
+ QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP
3215
+ 0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0
3216
+ glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa
3217
+ KaqW04MjyaR7YbPMAuhd
3218
+ -----END CERTIFICATE-----
3219
+
3220
+ GTS Root R4
3221
+ ===========
3222
+ -----BEGIN CERTIFICATE-----
3223
+ MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV
3224
+ UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
3225
+ UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
3226
+ ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq
3227
+ hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa
3228
+ 6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj
3229
+ QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV
3230
+ 2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI
3231
+ N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x
3232
+ zPKwTdb+mciUqXWi4w==
3233
+ -----END CERTIFICATE-----
3234
+
3235
+ UCA Global G2 Root
3236
+ ==================
3237
+ -----BEGIN CERTIFICATE-----
3238
+ MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG
3239
+ EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x
3240
+ NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU
3241
+ cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
3242
+ MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT
3243
+ oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV
3244
+ 8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS
3245
+ h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o
3246
+ LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/
3247
+ R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe
3248
+ KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa
3249
+ 4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc
3250
+ OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97
3251
+ 8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
3252
+ BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo
3253
+ 5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5
3254
+ 1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A
3255
+ Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9
3256
+ yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX
3257
+ c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo
3258
+ jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk
3259
+ bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x
3260
+ ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn
3261
+ RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A==
3262
+ -----END CERTIFICATE-----
3263
+
3264
+ UCA Extended Validation Root
3265
+ ============================
3266
+ -----BEGIN CERTIFICATE-----
3267
+ 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
3291
+ dhh2n1ax
3292
+ -----END CERTIFICATE-----
3293
+
3294
+ Certigna Root CA
3295
+ ================
3296
+ -----BEGIN CERTIFICATE-----
3297
+ MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE
3298
+ BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ
3299
+ MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda
3300
+ MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz
3301
+ MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC
3302
+ DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX
3303
+ stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz
3304
+ KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8
3305
+ JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16
3306
+ XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq
3307
+ 4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej
3308
+ wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ
3309
+ lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI
3310
+ jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/
3311
+ /TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
3312
+ HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of
3313
+ 1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy
3314
+ dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h
3315
+ LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl
3316
+ cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt
3317
+ OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP
3318
+ TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq
3319
+ 7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3
3320
+ 4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd
3321
+ 8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS
3322
+ 6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY
3323
+ tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS
3324
+ aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde
3325
+ E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
3326
+ -----END CERTIFICATE-----
3327
+
3328
+ emSign Root CA - G1
3329
+ ===================
3330
+ -----BEGIN CERTIFICATE-----
3331
+ MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET
3332
+ MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl
3333
+ ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx
3334
+ ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk
3335
+ aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB
3336
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN
3337
+ LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1
3338
+ cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW
3339
+ DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ
3340
+ 6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH
3341
+ hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG
3342
+ MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2
3343
+ vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q
3344
+ NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q
3345
+ +Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih
3346
+ U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
3347
+ iN66zB+Afko=
3348
+ -----END CERTIFICATE-----
3349
+
3350
+ emSign ECC Root CA - G3
3351
+ =======================
3352
+ -----BEGIN CERTIFICATE-----
3353
+ MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG
3354
+ A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg
3355
+ MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4
3356
+ MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11
3357
+ ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g
3358
+ RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc
3359
+ 58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr
3360
+ MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC
3361
+ AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D
3362
+ CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7
3363
+ jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj
3364
+ -----END CERTIFICATE-----
3365
+
3366
+ emSign Root CA - C1
3367
+ ===================
3368
+ -----BEGIN CERTIFICATE-----
3369
+ MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx
3370
+ EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp
3371
+ Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE
3372
+ BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD
3373
+ ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up
3374
+ ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/
3375
+ Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX
3376
+ OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V
3377
+ I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms
3378
+ lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+
3379
+ XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD
3380
+ ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp
3381
+ /6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1
3382
+ NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9
3383
+ wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ
3384
+ BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
3385
+ -----END CERTIFICATE-----
3386
+
3387
+ emSign ECC Root CA - C3
3388
+ =======================
3389
+ -----BEGIN CERTIFICATE-----
3390
+ MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG
3391
+ A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF
3392
+ Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE
3393
+ BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD
3394
+ ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd
3395
+ 6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9
3396
+ SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA
3397
+ B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA
3398
+ MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU
3399
+ ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
3400
+ -----END CERTIFICATE-----
3401
+
3402
+ Hongkong Post Root CA 3
3403
+ =======================
3404
+ -----BEGIN CERTIFICATE-----
3405
+ MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG
3406
+ A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK
3407
+ Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2
3408
+ MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv
3409
+ bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX
3410
+ SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz
3411
+ iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf
3412
+ jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim
3413
+ 5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe
3414
+ sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj
3415
+ 0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/
3416
+ JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u
3417
+ y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h
3418
+ +bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG
3419
+ xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID
3420
+ AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e
3421
+ i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN
3422
+ AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw
3423
+ W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld
3424
+ y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov
3425
+ +BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc
3426
+ eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw
3427
+ 9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7
3428
+ nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY
3429
+ hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB
3430
+ 60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq
3431
+ dBb9HxEGmpv0
3432
+ -----END CERTIFICATE-----
library/Vkontakte/Vkontakte.php CHANGED
@@ -11,7 +11,7 @@ class Vkontakte
11
  *
12
  * @link https://vk.com/dev/versions API version list
13
  */
14
- private $apiVersion = '5.37';
15
 
16
  /**
17
  * The client ID (app ID)
11
  *
12
  * @link https://vk.com/dev/versions API version list
13
  */
14
+ private $apiVersion = '5.103';
15
 
16
  /**
17
  * The client ID (app ID)
library/http.php DELETED
@@ -1,2124 +0,0 @@
1
- <?php
2
- /*
3
- * http.php
4
- *
5
- * @(#) $Header: /opt2/ena/metal/http/http.php,v 1.92 2014/08/14 23:17:34 mlemos Exp $
6
- *
7
- */
8
-
9
- define('HTTP_CLIENT_ERROR_UNSPECIFIED_ERROR', -1);
10
- define('HTTP_CLIENT_ERROR_NO_ERROR', 0);
11
- define('HTTP_CLIENT_ERROR_INVALID_SERVER_ADDRESS', 1);
12
- define('HTTP_CLIENT_ERROR_CANNOT_CONNECT', 2);
13
- define('HTTP_CLIENT_ERROR_COMMUNICATION_FAILURE', 3);
14
- define('HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE', 4);
15
- define('HTTP_CLIENT_ERROR_PROTOCOL_FAILURE', 5);
16
- define('HTTP_CLIENT_ERROR_INVALID_PARAMETERS', 6);
17
-
18
- if(!class_exists('http_class')){
19
- class http_class
20
- {
21
- var $host_name="";
22
- var $host_port=0;
23
- var $proxy_host_name="";
24
- var $proxy_host_port=80;
25
- var $socks_host_name = '';
26
- var $socks_host_port = 1080;
27
- var $socks_version = '5';
28
-
29
- var $protocol="http";
30
- var $request_method="GET";
31
- var $user_agent='httpclient (http://www.phpclasses.org/httpclient $Revision: 1.92 $)';
32
- var $accept='';
33
- var $authentication_mechanism="";
34
- var $user;
35
- var $password;
36
- var $realm;
37
- var $workstation;
38
- var $proxy_authentication_mechanism="";
39
- var $proxy_user;
40
- var $proxy_password;
41
- var $proxy_realm;
42
- var $proxy_workstation;
43
- var $request_uri="";
44
- var $request="";
45
- var $request_headers=array();
46
- var $request_user;
47
- var $request_password;
48
- var $request_realm;
49
- var $request_workstation;
50
- var $proxy_request_user;
51
- var $proxy_request_password;
52
- var $proxy_request_realm;
53
- var $proxy_request_workstation;
54
- var $request_body="";
55
- var $request_arguments=array();
56
- var $protocol_version="1.1";
57
- var $timeout=0;
58
- var $data_timeout=0;
59
- var $debug=0;
60
- var $log_debug=0;
61
- var $debug_response_body=1;
62
- var $html_debug=0;
63
- var $support_cookies=1;
64
- var $cookies=array();
65
- var $error="";
66
- var $error_code = HTTP_CLIENT_ERROR_NO_ERROR;
67
- var $exclude_address="";
68
- var $follow_redirect=0;
69
- var $redirection_limit=5;
70
- var $response_status="";
71
- var $response_message="";
72
- var $file_buffer_length=8000;
73
- var $force_multipart_form_post=0;
74
- var $prefer_curl = 0;
75
- var $keep_alive = 1;
76
- var $sasl_authenticate = 1;
77
-
78
- /* private variables - DO NOT ACCESS */
79
-
80
- var $state="Disconnected";
81
- var $use_curl=0;
82
- var $connection=0;
83
- var $content_length=0;
84
- var $response="";
85
- var $read_response=0;
86
- var $read_length=0;
87
- var $request_host="";
88
- var $next_token="";
89
- var $redirection_level=0;
90
- var $chunked=0;
91
- var $remaining_chunk=0;
92
- var $last_chunk_read=0;
93
- var $months=array(
94
- "Jan"=>"01",
95
- "Feb"=>"02",
96
- "Mar"=>"03",
97
- "Apr"=>"04",
98
- "May"=>"05",
99
- "Jun"=>"06",
100
- "Jul"=>"07",
101
- "Aug"=>"08",
102
- "Sep"=>"09",
103
- "Oct"=>"10",
104
- "Nov"=>"11",
105
- "Dec"=>"12");
106
- var $session='';
107
- var $connection_close=0;
108
- var $force_close = 0;
109
- var $connected_host = '';
110
- var $connected_port = -1;
111
- var $connected_ssl = 0;
112
-
113
- /* Private methods - DO NOT CALL */
114
-
115
- Function Tokenize($string,$separator="")
116
- {
117
- if(!strcmp($separator,""))
118
- {
119
- $separator=$string;
120
- $string=$this->next_token;
121
- }
122
- for($character=0;$character<strlen($separator);$character++)
123
- {
124
- if(GetType($position=strpos($string,$separator[$character]))=="integer")
125
- $found=(IsSet($found) ? min($found,$position) : $position);
126
- }
127
- if(IsSet($found))
128
- {
129
- $this->next_token=substr($string,$found+1);
130
- return(substr($string,0,$found));
131
- }
132
- else
133
- {
134
- $this->next_token="";
135
- return($string);
136
- }
137
- }
138
-
139
- Function CookieEncode($value, $name)
140
- {
141
- return($name ? str_replace("=", "%25", $value) : str_replace(";", "%3B", $value));
142
- }
143
-
144
- Function SetError($error, $error_code = HTTP_CLIENT_ERROR_UNSPECIFIED_ERROR)
145
- {
146
- $this->error_code = $error_code;
147
- return($this->error=$error);
148
- }
149
-
150
- Function SetPHPError($error, $error_code = HTTP_CLIENT_ERROR_UNSPECIFIED_ERROR)
151
- {
152
- return($this->SetError($error, $error_code));
153
- }
154
-
155
- Function SetDataAccessError($error,$check_connection=0)
156
- {
157
- $this->error=$error;
158
- $this->error_code = HTTP_CLIENT_ERROR_COMMUNICATION_FAILURE;
159
- if(!$this->use_curl
160
- && function_exists("socket_get_status"))
161
- {
162
- $status=socket_get_status($this->connection);
163
- if($status["timed_out"])
164
- $this->error.=": data access time out";
165
- elseif($status["eof"])
166
- {
167
- if($check_connection)
168
- $this->error="";
169
- else
170
- $this->error.=": the server disconnected";
171
- }
172
- }
173
- }
174
-
175
- Function OutputDebug($message)
176
- {
177
- if($this->log_debug)
178
- error_log($message);
179
- else
180
- {
181
- $message.="\n";
182
- if($this->html_debug)
183
- $message=str_replace("\n","<br />\n",HtmlEntities($message));
184
- echo $message;
185
- flush();
186
- }
187
- }
188
-
189
- Function GetLine()
190
- {
191
- for($line="";;)
192
- {
193
- if($this->use_curl)
194
- {
195
- $eol=strpos($this->response,"\n",$this->read_response);
196
- $data=($eol ? substr($this->response,$this->read_response,$eol+1-$this->read_response) : "");
197
- $this->read_response+=strlen($data);
198
- }
199
- else
200
- {
201
- if(feof($this->connection))
202
- {
203
- $this->SetDataAccessError("reached the end of data while reading from the HTTP server connection");
204
- return(0);
205
- }
206
- $data=fgets($this->connection,100);
207
- }
208
- if(GetType($data)!="string"
209
- || strlen($data)==0)
210
- {
211
- $this->SetDataAccessError("it was not possible to read line from the HTTP server");
212
- return(0);
213
- }
214
- $line.=$data;
215
- $length=strlen($line);
216
- if($length
217
- && !strcmp(substr($line,$length-1,1),"\n"))
218
- {
219
- $length-=(($length>=2 && !strcmp(substr($line,$length-2,1),"\r")) ? 2 : 1);
220
- $line=substr($line,0,$length);
221
- if($this->debug)
222
- $this->OutputDebug("S $line");
223
- return($line);
224
- }
225
- }
226
- }
227
-
228
- Function PutLine($line)
229
- {
230
- if($this->debug)
231
- $this->OutputDebug("C $line");
232
- if(!fputs($this->connection,$line."\r\n"))
233
- {
234
- $this->SetDataAccessError("it was not possible to send a line to the HTTP server");
235
- return(0);
236
- }
237
- return(1);
238
- }
239
-
240
- Function PutData($data)
241
- {
242
- if(strlen($data))
243
- {
244
- if($this->debug)
245
- $this->OutputDebug('C '.$data);
246
- if(!fputs($this->connection,$data))
247
- {
248
- $this->SetDataAccessError("it was not possible to send data to the HTTP server");
249
- return(0);
250
- }
251
- }
252
- return(1);
253
- }
254
-
255
- Function FlushData()
256
- {
257
- if(!fflush($this->connection))
258
- {
259
- $this->SetDataAccessError("it was not possible to send data to the HTTP server");
260
- return(0);
261
- }
262
- return(1);
263
- }
264
-
265
- Function ReadChunkSize()
266
- {
267
- if($this->remaining_chunk==0)
268
- {
269
- $debug=$this->debug;
270
- if(!$this->debug_response_body)
271
- $this->debug=0;
272
- $line=$this->GetLine();
273
- $this->debug=$debug;
274
- if(GetType($line)!="string")
275
- return($this->SetError("could not read chunk start: ".$this->error, $this->error_code));
276
- $this->remaining_chunk=hexdec($line);
277
- if($this->remaining_chunk == 0)
278
- {
279
- if(!$this->debug_response_body)
280
- $this->debug=0;
281
- $line=$this->GetLine();
282
- $this->debug=$debug;
283
- if(GetType($line)!="string")
284
- return($this->SetError("could not read chunk end: ".$this->error, $this->error_code));
285
- }
286
- }
287
- return("");
288
- }
289
-
290
- Function ReadBytes($length)
291
- {
292
- if($this->use_curl)
293
- {
294
- $bytes=substr($this->response,$this->read_response,min($length,strlen($this->response)-$this->read_response));
295
- $this->read_response+=strlen($bytes);
296
- if($this->debug
297
- && $this->debug_response_body
298
- && strlen($bytes))
299
- $this->OutputDebug("S ".$bytes);
300
- }
301
- else
302
- {
303
- if($this->chunked)
304
- {
305
- for($bytes="",$remaining=$length;$remaining;)
306
- {
307
- if(strlen($this->ReadChunkSize()))
308
- return("");
309
- if($this->remaining_chunk==0)
310
- {
311
- $this->last_chunk_read=1;
312
- break;
313
- }
314
- $ask=min($this->remaining_chunk,$remaining);
315
- $chunk=@fread($this->connection,$ask);
316
- $read=strlen($chunk);
317
- if($read==0)
318
- {
319
- $this->SetDataAccessError("it was not possible to read data chunk from the HTTP server");
320
- return("");
321
- }
322
- if($this->debug
323
- && $this->debug_response_body)
324
- $this->OutputDebug("S ".$chunk);
325
- $bytes.=$chunk;
326
- $this->remaining_chunk-=$read;
327
- $remaining-=$read;
328
- if($this->remaining_chunk==0)
329
- {
330
- if(feof($this->connection))
331
- return($this->SetError("reached the end of data while reading the end of data chunk mark from the HTTP server", HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
332
- $data=@fread($this->connection,2);
333
- if(strcmp($data,"\r\n"))
334
- {
335
- $this->SetDataAccessError("it was not possible to read end of data chunk from the HTTP server");
336
- return("");
337
- }
338
- }
339
- }
340
- }
341
- else
342
- {
343
- $bytes=@fread($this->connection,$length);
344
- if(strlen($bytes))
345
- {
346
- if($this->debug
347
- && $this->debug_response_body)
348
- $this->OutputDebug("S ".$bytes);
349
- }
350
- else
351
- $this->SetDataAccessError("it was not possible to read data from the HTTP server", $this->connection_close);
352
- }
353
- }
354
- return($bytes);
355
- }
356
-
357
- Function EndOfInput()
358
- {
359
- if($this->use_curl)
360
- return($this->read_response>=strlen($this->response));
361
- if($this->chunked)
362
- return($this->last_chunk_read);
363
- if($this->content_length_set)
364
- return($this->content_length <= $this->read_length);
365
- return(feof($this->connection));
366
- }
367
-
368
- Function Resolve($domain, &$ip, $server_type)
369
- {
370
- if(preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/',$domain))
371
- $ip=$domain;
372
- else
373
- {
374
- if($this->debug)
375
- $this->OutputDebug('Resolving '.$server_type.' server domain "'.$domain.'"...');
376
- if(!strcmp($ip=@gethostbyname($domain),$domain))
377
- $ip="";
378
- }
379
- if(strlen($ip)==0
380
- || (strlen($this->exclude_address)
381
- && !strcmp(@gethostbyname($this->exclude_address),$ip)))
382
- return($this->SetError("could not resolve the host domain \"".$domain."\"", HTTP_CLIENT_ERROR_INVALID_SERVER_ADDRESS));
383
- return('');
384
- }
385
-
386
- Function Connect($host_name, $host_port, $ssl, $server_type = 'HTTP')
387
- {
388
- $domain=$host_name;
389
- $port = $host_port;
390
- if(strlen($error = $this->Resolve($domain, $ip, $server_type)))
391
- return($error);
392
- if(strlen($this->socks_host_name))
393
- {
394
- switch($this->socks_version)
395
- {
396
- case '4':
397
- $version = 4;
398
- break;
399
- case '5':
400
- $version = 5;
401
- break;
402
- default:
403
- return('it was not specified a supported SOCKS protocol version');
404
- break;
405
- }
406
- $host_ip = $ip;
407
- $port = $this->socks_host_port;
408
- $host_server_type = $server_type;
409
- $server_type = 'SOCKS';
410
- if(strlen($error = $this->Resolve($this->socks_host_name, $ip, $server_type)))
411
- return($error);
412
- }
413
- if($this->debug)
414
- $this->OutputDebug('Connecting to '.$server_type.' server IP '.$ip.' port '.$port.'...');
415
- if($ssl)
416
- $ip="ssl://".$host_name;
417
- if(($this->connection=($this->timeout ? @fsockopen($ip, $port, $errno, $error, $this->timeout) : @fsockopen($ip, $port, $errno)))==0)
418
- {
419
- $error_code = HTTP_CLIENT_ERROR_CANNOT_CONNECT;
420
- switch($errno)
421
- {
422
- case -3:
423
- return($this->SetError("socket could not be created", $error_code));
424
- case -4:
425
- return($this->SetError("dns lookup on hostname \"".$host_name."\" failed", $error_code));
426
- case -5:
427
- return($this->SetError("connection refused or timed out", $error_code));
428
- case -6:
429
- return($this->SetError("fdopen() call failed", $error_code));
430
- case -7:
431
- return($this->SetError("setvbuf() call failed", $error_code));
432
- default:
433
- return($this->SetPHPError($errno." could not connect to the host \"".$host_name."\"", $error_code));
434
- }
435
- }
436
- else
437
- {
438
- if($this->data_timeout
439
- && function_exists("socket_set_timeout"))
440
- socket_set_timeout($this->connection,$this->data_timeout,0);
441
- if(strlen($this->socks_host_name))
442
- {
443
- if($this->debug)
444
- $this->OutputDebug('Connected to the SOCKS server '.$this->socks_host_name);
445
- $send_error = 'it was not possible to send data to the SOCKS server';
446
- $receive_error = 'it was not possible to receive data from the SOCKS server';
447
- switch($version)
448
- {
449
- case 4:
450
- $command = 1;
451
- $user = '';
452
- if(!fputs($this->connection, chr($version).chr($command).pack('nN', $host_port, ip2long($host_ip)).$user.Chr(0)))
453
- $error = $this->SetDataAccessError($send_error);
454
- else
455
- {
456
- $response = fgets($this->connection, 9);
457
- if(strlen($response) != 8)
458
- $error = $this->SetDataAccessError($receive_error);
459
- else
460
- {
461
- $socks_errors = array(
462
- "\x5a"=>'',
463
- "\x5b"=>'request rejected',
464
- "\x5c"=>'request failed because client is not running identd (or not reachable from the server)',
465
- "\x5d"=>'request failed because client\'s identd could not confirm the user ID string in the request',
466
- );
467
- $error_code = $response[1];
468
- $error = (IsSet($socks_errors[$error_code]) ? $socks_errors[$error_code] : 'unknown');
469
- if(strlen($error))
470
- $error = 'SOCKS error: '.$error;
471
- }
472
- }
473
- break;
474
- case 5:
475
- if($this->debug)
476
- $this->OutputDebug('Negotiating the authentication method ...');
477
- $methods = 1;
478
- $method = 0;
479
- if(!fputs($this->connection, chr($version).chr($methods).chr($method)))
480
- $error = $this->SetDataAccessError($send_error);
481
- else
482
- {
483
- $response = fgets($this->connection, 3);
484
- if(strlen($response) != 2)
485
- $error = $this->SetDataAccessError($receive_error);
486
- elseif(Ord($response[1]) != $method)
487
- $error = 'the SOCKS server requires an authentication method that is not yet supported';
488
- else
489
- {
490
- if($this->debug)
491
- $this->OutputDebug('Connecting to '.$host_server_type.' server IP '.$host_ip.' port '.$host_port.'...');
492
- $command = 1;
493
- $address_type = 1;
494
- if(!fputs($this->connection, chr($version).chr($command)."\x00".chr($address_type).pack('Nn', ip2long($host_ip), $host_port)))
495
- $error = $this->SetDataAccessError($send_error);
496
- else
497
- {
498
- $response = fgets($this->connection, 11);
499
- if(strlen($response) != 10)
500
- $error = $this->SetDataAccessError($receive_error);
501
- else
502
- {
503
- $socks_errors = array(
504
- "\x00"=>'',
505
- "\x01"=>'general SOCKS server failure',
506
- "\x02"=>'connection not allowed by ruleset',
507
- "\x03"=>'Network unreachable',
508
- "\x04"=>'Host unreachable',
509
- "\x05"=>'Connection refused',
510
- "\x06"=>'TTL expired',
511
- "\x07"=>'Command not supported',
512
- "\x08"=>'Address type not supported'
513
- );
514
- $error_code = $response[1];
515
- $error = (IsSet($socks_errors[$error_code]) ? $socks_errors[$error_code] : 'unknown');
516
- if(strlen($error))
517
- $error = 'SOCKS error: '.$error;
518
- }
519
- }
520
- }
521
- }
522
- break;
523
- default:
524
- $error = 'support for SOCKS protocol version '.$this->socks_version.' is not yet implemented';
525
- break;
526
- }
527
- if(strlen($error))
528
- {
529
- fclose($this->connection);
530
- return($error);
531
- }
532
- }
533
- if($this->debug)
534
- $this->OutputDebug("Connected to $host_name");
535
- if(strlen($this->proxy_host_name)
536
- && !strcmp(strtolower($this->protocol), 'https'))
537
- {
538
- if(function_exists('stream_socket_enable_crypto')
539
- && in_array('ssl', stream_get_transports()))
540
- $this->state = "ConnectedToProxy";
541
- else
542
- {
543
- $this->OutputDebug("It is not possible to start SSL after connecting to the proxy server. If the proxy refuses to forward the SSL request, you may need to upgrade to PHP 5.1 or later with OpenSSL support enabled.");
544
- $this->state="Connected";
545
- }
546
- }
547
- else
548
- $this->state="Connected";
549
- return("");
550
- }
551
- }
552
-
553
- Function Disconnect()
554
- {
555
- if($this->debug)
556
- $this->OutputDebug("Disconnected from ".$this->connected_host);
557
- if($this->use_curl)
558
- {
559
- curl_close($this->connection);
560
- $this->response="";
561
- }
562
- else
563
- fclose($this->connection);
564
- $this->state="Disconnected";
565
- return("");
566
- }
567
-
568
- /* Public methods */
569
-
570
- Function GetRequestArguments($url, &$arguments)
571
- {
572
- $this->error = '';
573
- $this->error_code = HTTP_CLIENT_ERROR_NO_ERROR;
574
- $arguments=array();
575
- $url = str_replace(' ', '%20', $url);
576
- $parameters=@parse_url($url);
577
- if(!$parameters)
578
- return($this->SetError("it was not specified a valid URL", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
579
- if(!IsSet($parameters["scheme"]))
580
- return($this->SetError("it was not specified the protocol type argument", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
581
- switch(strtolower($parameters["scheme"]))
582
- {
583
- case "http":
584
- case "https":
585
- $arguments["Protocol"]=$parameters["scheme"];
586
- break;
587
- default:
588
- return($parameters["scheme"]." connection scheme is not yet supported");
589
- }
590
- if(!IsSet($parameters["host"]))
591
- return($this->SetError("it was not specified the connection host argument", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
592
- $arguments["HostName"]=$parameters["host"];
593
- $arguments["Headers"]=array("Host"=>$parameters["host"].(IsSet($parameters["port"]) ? ":".$parameters["port"] : ""));
594
- if(IsSet($parameters["user"]))
595
- {
596
- $arguments["AuthUser"]=UrlDecode($parameters["user"]);
597
- if(!IsSet($parameters["pass"]))
598
- $arguments["AuthPassword"]="";
599
- }
600
- if(IsSet($parameters["pass"]))
601
- {
602
- if(!IsSet($parameters["user"]))
603
- $arguments["AuthUser"]="";
604
- $arguments["AuthPassword"]=UrlDecode($parameters["pass"]);
605
- }
606
- if(IsSet($parameters["port"]))
607
- {
608
- if(strcmp($parameters["port"],strval(intval($parameters["port"]))))
609
- return($this->SetError("it was not specified a valid connection host argument", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
610
- $arguments["HostPort"]=intval($parameters["port"]);
611
- }
612
- else
613
- $arguments["HostPort"]=0;
614
- $arguments["RequestURI"]=(IsSet($parameters["path"]) ? $parameters["path"] : "/").(IsSet($parameters["query"]) ? "?".$parameters["query"] : "");
615
- if(strlen($this->user_agent))
616
- $arguments["Headers"]["User-Agent"]=$this->user_agent;
617
- if(strlen($this->accept))
618
- $arguments["Headers"]["Accept"]=$this->accept;
619
- return("");
620
- }
621
-
622
- Function Open($arguments)
623
- {
624
- if(strlen($this->error))
625
- return($this->error);
626
- $error_code = HTTP_CLIENT_ERROR_UNSPECIFIED_ERROR;
627
- if(IsSet($arguments["HostName"]))
628
- $this->host_name=$arguments["HostName"];
629
- if(IsSet($arguments["HostPort"]))
630
- $this->host_port=$arguments["HostPort"];
631
- if(IsSet($arguments["ProxyHostName"]))
632
- $this->proxy_host_name=$arguments["ProxyHostName"];
633
- if(IsSet($arguments["ProxyHostPort"]))
634
- $this->proxy_host_port=$arguments["ProxyHostPort"];
635
- if(IsSet($arguments["SOCKSHostName"]))
636
- $this->socks_host_name=$arguments["SOCKSHostName"];
637
- if(IsSet($arguments["SOCKSHostPort"]))
638
- $this->socks_host_port=$arguments["SOCKSHostPort"];
639
- if(IsSet($arguments["SOCKSVersion"]))
640
- $this->socks_version=$arguments["SOCKSVersion"];
641
- if(IsSet($arguments["Protocol"]))
642
- $this->protocol=$arguments["Protocol"];
643
- switch(strtolower($this->protocol))
644
- {
645
- case "http":
646
- $default_port=80;
647
- break;
648
- case "https":
649
- $default_port=443;
650
- break;
651
- default:
652
- return($this->SetError("it was not specified a valid connection protocol", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
653
- }
654
- if(strlen($this->proxy_host_name)==0)
655
- {
656
- if(strlen($this->host_name)==0)
657
- return($this->SetError("it was not specified a valid hostname", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
658
- $host_name=$this->host_name;
659
- $host_port=($this->host_port ? $this->host_port : $default_port);
660
- $server_type = 'HTTP';
661
- }
662
- else
663
- {
664
- $host_name=$this->proxy_host_name;
665
- $host_port=$this->proxy_host_port;
666
- $server_type = 'HTTP proxy';
667
- }
668
- $ssl=(strtolower($this->protocol)=="https" && strlen($this->proxy_host_name)==0);
669
- if($ssl
670
- && strlen($this->socks_host_name))
671
- return($this->SetError('establishing SSL connections via a SOCKS server is not yet supported', HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
672
- $this->use_curl=($ssl && $this->prefer_curl && function_exists("curl_init"));
673
- switch($this->state)
674
- {
675
- case 'Connected':
676
- if(!strcmp($host_name, $this->connected_host)
677
- && intval($host_port) == $this->connected_port
678
- && intval($ssl) == $this->connected_ssl)
679
- {
680
- if($this->debug)
681
- $this->OutputDebug("Reusing connection to ".$this->connected_host);
682
- return('');
683
- }
684
- if(strlen($error = $this->Disconnect()))
685
- return($error);
686
- case "Disconnected":
687
- break;
688
- default:
689
- return("1 already connected");
690
- }
691
- if($this->debug)
692
- $this->OutputDebug("Connecting to ".$this->host_name);
693
- if($this->use_curl)
694
- {
695
- $error=(($this->connection=curl_init($this->protocol."://".$this->host_name.($host_port==$default_port ? "" : ":".strval($host_port))."/")) ? "" : "Could not initialize a CURL session");
696
- if(strlen($error)==0)
697
- {
698
- if(IsSet($arguments["SSLCertificateFile"]))
699
- curl_setopt($this->connection,CURLOPT_SSLCERT,$arguments["SSLCertificateFile"]);
700
- if(IsSet($arguments["SSLCertificatePassword"]))
701
- curl_setopt($this->connection,CURLOPT_SSLCERTPASSWD,$arguments["SSLCertificatePassword"]);
702
- if(IsSet($arguments["SSLKeyFile"]))
703
- curl_setopt($this->connection,CURLOPT_SSLKEY,$arguments["SSLKeyFile"]);
704
- if(IsSet($arguments["SSLKeyPassword"]))
705
- curl_setopt($this->connection,CURLOPT_SSLKEYPASSWD,$arguments["SSLKeyPassword"]);
706
- }
707
- $this->state="Connected";
708
- }
709
- else
710
- {
711
- $error="";
712
- if(strlen($this->proxy_host_name)
713
- && (IsSet($arguments["SSLCertificateFile"])
714
- || IsSet($arguments["SSLCertificateFile"])))
715
- $error="establishing SSL connections using certificates or private keys via non-SSL proxies is not supported";
716
- else
717
- {
718
- if($ssl)
719
- {
720
- if(IsSet($arguments["SSLCertificateFile"]))
721
- $error="establishing SSL connections using certificates is only supported when the cURL extension is enabled";
722
- elseif(IsSet($arguments["SSLKeyFile"]))
723
- $error="establishing SSL connections using a private key is only supported when the cURL extension is enabled";
724
- else
725
- {
726
- $version=explode(".",function_exists("phpversion") ? phpversion() : "3.0.7");
727
- $php_version=intval($version[0])*1000000+intval($version[1])*1000+intval($version[2]);
728
- if($php_version<4003000)
729
- $error="establishing SSL connections requires at least PHP version 4.3.0 or having the cURL extension enabled";
730
- elseif(!function_exists("extension_loaded")
731
- || !extension_loaded("openssl"))
732
- $error="establishing SSL connections requires the OpenSSL extension enabled";
733
- }
734
- }
735
- if(strlen($error)==0)
736
- {
737
- $error=$this->Connect($host_name, $host_port, $ssl, $server_type);
738
- $error_code = $this->error_code;
739
- }
740
- }
741
- }
742
- if(strlen($error))
743
- return($this->SetError($error, $error_code));
744
- $this->session=md5(uniqid(""));
745
- $this->connected_host = $host_name;
746
- $this->connected_port = intval($host_port);
747
- $this->connected_ssl = intval($ssl);
748
- return("");
749
- }
750
-
751
- Function Close($force = 0)
752
- {
753
- if($this->state=="Disconnected")
754
- return("1 already disconnected");
755
- if(!$this->force_close
756
- && $this->keep_alive
757
- && !$force
758
- && $this->state == 'ResponseReceived')
759
- {
760
- if($this->debug)
761
- $this->OutputDebug('Keeping the connection alive to '.$this->connected_host);
762
- $this->state = 'Connected';
763
- return('');
764
- }
765
- return($this->Disconnect());
766
- }
767
-
768
- Function PickCookies(&$cookies,$secure)
769
- {
770
- if(IsSet($this->cookies[$secure]))
771
- {
772
- $now=gmdate("Y-m-d H-i-s");
773
- for($domain=0,Reset($this->cookies[$secure]);$domain<count($this->cookies[$secure]);Next($this->cookies[$secure]),$domain++)
774
- {
775
- $domain_pattern=Key($this->cookies[$secure]);
776
- $match=strlen($this->request_host)-strlen($domain_pattern);
777
- if($match>=0
778
- && !strcmp($domain_pattern,substr($this->request_host,$match))
779
- && ($match==0
780
- || $domain_pattern[0]=="."
781
- || $this->request_host[$match-1]=="."))
782
- {
783
- for(Reset($this->cookies[$secure][$domain_pattern]),$path_part=0;$path_part<count($this->cookies[$secure][$domain_pattern]);Next($this->cookies[$secure][$domain_pattern]),$path_part++)
784
- {
785
- $path=Key($this->cookies[$secure][$domain_pattern]);
786
- if(strlen($this->request_uri)>=strlen($path)
787
- && substr($this->request_uri,0,strlen($path))==$path)
788
- {
789
- for(Reset($this->cookies[$secure][$domain_pattern][$path]),$cookie=0;$cookie<count($this->cookies[$secure][$domain_pattern][$path]);Next($this->cookies[$secure][$domain_pattern][$path]),$cookie++)
790
- {
791
- $cookie_name=Key($this->cookies[$secure][$domain_pattern][$path]);
792
- $expires=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]["expires"];
793
- if($expires==""
794
- || strcmp($now,$expires)<0)
795
- $cookies[$cookie_name]=$this->cookies[$secure][$domain_pattern][$path][$cookie_name];
796
- }
797
- }
798
- }
799
- }
800
- }
801
- }
802
- }
803
-
804
- Function GetFileDefinition($file, &$definition)
805
- {
806
- $name="";
807
- if(IsSet($file["FileName"]))
808
- $name=basename($file["FileName"]);
809
- if(IsSet($file["Name"]))
810
- $name=$file["Name"];
811
- if(strlen($name)==0)
812
- return("it was not specified the file part name");
813
- if(IsSet($file["Content-Type"]))
814
- {
815
- $content_type=$file["Content-Type"];
816
- $type=$this->Tokenize(strtolower($content_type),"/");
817
- $sub_type=$this->Tokenize("");
818
- switch($type)
819
- {
820
- case "text":
821
- case "image":
822
- case "audio":
823
- case "video":
824
- case "application":
825
- case "message":
826
- break;
827
- case "automatic":
828
- switch($sub_type)
829
- {
830
- case "name":
831
- switch(GetType($dot=strrpos($name,"."))=="integer" ? strtolower(substr($name,$dot)) : "")
832
- {
833
- case ".xls":
834
- $content_type="application/excel";
835
- break;
836
- case ".hqx":
837
- $content_type="application/macbinhex40";
838
- break;
839
- case ".doc":
840
- case ".dot":
841
- case ".wrd":
842
- $content_type="application/msword";
843
- break;
844
- case ".pdf":
845
- $content_type="application/pdf";
846
- break;
847
- case ".pgp":
848
- $content_type="application/pgp";
849
- break;
850
- case ".ps":
851
- case ".eps":
852
- case ".ai":
853
- $content_type="application/postscript";
854
- break;
855
- case ".ppt":
856
- $content_type="application/powerpoint";
857
- break;
858
- case ".rtf":
859
- $content_type="application/rtf";
860
- break;
861
- case ".tgz":
862
- case ".gtar":
863
- $content_type="application/x-gtar";
864
- break;
865
- case ".gz":
866
- $content_type="application/x-gzip";
867
- break;
868
- case ".php":
869
- case ".php3":
870
- $content_type="application/x-httpd-php";
871
- break;
872
- case ".js":
873
- $content_type="application/x-javascript";
874
- break;
875
- case ".ppd":
876
- case ".psd":
877
- $content_type="application/x-photoshop";
878
- break;
879
- case ".swf":
880
- case ".swc":
881
- case ".rf":
882
- $content_type="application/x-shockwave-flash";
883
- break;
884
- case ".tar":
885
- $content_type="application/x-tar";
886
- break;
887
- case ".zip":
888
- $content_type="application/zip";
889
- break;
890
- case ".mid":
891
- case ".midi":
892
- case ".kar":
893
- $content_type="audio/midi";
894
- break;
895
- case ".mp2":
896
- case ".mp3":
897
- case ".mpga":
898
- $content_type="audio/mpeg";
899
- break;
900
- case ".ra":
901
- $content_type="audio/x-realaudio";
902
- break;
903
- case ".wav":
904
- $content_type="audio/wav";
905
- break;
906
- case ".bmp":
907
- $content_type="image/bitmap";
908
- break;
909
- case ".gif":
910
- $content_type="image/gif";
911
- break;
912
- case ".iff":
913
- $content_type="image/iff";
914
- break;
915
- case ".jb2":
916
- $content_type="image/jb2";
917
- break;
918
- case ".jpg":
919
- case ".jpe":
920
- case ".jpeg":
921
- $content_type="image/jpeg";
922
- break;
923
- case ".jpx":
924
- $content_type="image/jpx";
925
- break;
926
- case ".png":
927
- $content_type="image/png";
928
- break;
929
- case ".tif":
930
- case ".tiff":
931
- $content_type="image/tiff";
932
- break;
933
- case ".wbmp":
934
- $content_type="image/vnd.wap.wbmp";
935
- break;
936
- case ".xbm":
937
- $content_type="image/xbm";
938
- break;
939
- case ".css":
940
- $content_type="text/css";
941
- break;
942
- case ".txt":
943
- $content_type="text/plain";
944
- break;
945
- case ".htm":
946
- case ".html":
947
- $content_type="text/html";
948
- break;
949
- case ".xml":
950
- $content_type="text/xml";
951
- break;
952
- case ".mpg":
953
- case ".mpe":
954
- case ".mpeg":
955
- $content_type="video/mpeg";
956
- break;
957
- case ".qt":
958
- case ".mov":
959
- $content_type="video/quicktime";
960
- break;
961
- case ".avi":
962
- $content_type="video/x-ms-video";
963
- break;
964
- case ".eml":
965
- $content_type="message/rfc822";
966
- break;
967
- default:
968
- $content_type="application/octet-stream";
969
- break;
970
- }
971
- break;
972
- default:
973
- return($content_type." is not a supported automatic content type detection method");
974
- }
975
- break;
976
- default:
977
- return($content_type." is not a supported file content type");
978
- }
979
- }
980
- else
981
- $content_type="application/octet-stream";
982
- $definition=array(
983
- "Content-Type"=>$content_type,
984
- "NAME"=>$name
985
- );
986
- if(IsSet($file["FileName"]))
987
- {
988
- if(GetType($length=@filesize($file["FileName"]))!="integer")
989
- {
990
- $error="it was not possible to determine the length of the file ".$file["FileName"];
991
-
992
- if(!file_exists($file["FileName"]))
993
- $error="it was not possible to access the file ".$file["FileName"];
994
- return($error);
995
- }
996
- $definition["FILENAME"]=$file["FileName"];
997
- $definition["Content-Length"]=$length;
998
- }
999
- elseif(IsSet($file["Data"]))
1000
- $definition["Content-Length"]=strlen($definition["DATA"]=$file["Data"]);
1001
- else
1002
- return("it was not specified a valid file name");
1003
- return("");
1004
- }
1005
-
1006
- Function ConnectFromProxy($arguments, &$headers)
1007
- {
1008
- if(!$this->PutLine('CONNECT '.$this->host_name.':'.($this->host_port ? $this->host_port : 443).' HTTP/1.0')
1009
- || (strlen($this->user_agent)
1010
- && !$this->PutLine('User-Agent: '.$this->user_agent))
1011
- || (strlen($this->accept)
1012
- && !$this->PutLine('Accept: '.$this->accept))
1013
- || (IsSet($arguments['Headers']['Proxy-Authorization'])
1014
- && !$this->PutLine('Proxy-Authorization: '.$arguments['Headers']['Proxy-Authorization']))
1015
- || !$this->PutLine(''))
1016
- {
1017
- $this->Disconnect();
1018
- return($this->error);
1019
- }
1020
- $this->state = "ConnectSent";
1021
- if(strlen($error=$this->ReadReplyHeadersResponse($headers)))
1022
- return($error);
1023
- $proxy_authorization="";
1024
- while(!strcmp($this->response_status, "100"))
1025
- {
1026
- $this->state="ConnectSent";
1027
- if(strlen($error=$this->ReadReplyHeadersResponse($headers)))
1028
- return($error);
1029
- }
1030
- switch($this->response_status)
1031
- {
1032
- case "200":
1033
- if(!@stream_socket_enable_crypto($this->connection, 1, STREAM_CRYPTO_METHOD_SSLv23_CLIENT))
1034
- {
1035
- $this->SetPHPError('it was not possible to start a SSL encrypted connection via this proxy', HTTP_CLIENT_ERROR_COMMUNICATION_FAILURE);
1036
- $this->Disconnect();
1037
- return($this->error);
1038
- }
1039
- $this->state = "Connected";
1040
- break;
1041
- case "407":
1042
- if(strlen($error=$this->Authenticate($headers, -1, $proxy_authorization, $this->proxy_request_user, $this->proxy_request_password, $this->proxy_request_realm, $this->proxy_request_workstation)))
1043
- return($error);
1044
- break;
1045
- default:
1046
- return($this->SetError("unable to send request via proxy", HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1047
- }
1048
- return("");
1049
- }
1050
-
1051
- Function SendRequest($arguments)
1052
- {
1053
- if(strlen($this->error))
1054
- return($this->error);
1055
- if(IsSet($arguments["ProxyUser"]))
1056
- $this->proxy_request_user=$arguments["ProxyUser"];
1057
- elseif(IsSet($this->proxy_user))
1058
- $this->proxy_request_user=$this->proxy_user;
1059
- if(IsSet($arguments["ProxyPassword"]))
1060
- $this->proxy_request_password=$arguments["ProxyPassword"];
1061
- elseif(IsSet($this->proxy_password))
1062
- $this->proxy_request_password=$this->proxy_password;
1063
- if(IsSet($arguments["ProxyRealm"]))
1064
- $this->proxy_request_realm=$arguments["ProxyRealm"];
1065
- elseif(IsSet($this->proxy_realm))
1066
- $this->proxy_request_realm=$this->proxy_realm;
1067
- if(IsSet($arguments["ProxyWorkstation"]))
1068
- $this->proxy_request_workstation=$arguments["ProxyWorkstation"];
1069
- elseif(IsSet($this->proxy_workstation))
1070
- $this->proxy_request_workstation=$this->proxy_workstation;
1071
- switch($this->state)
1072
- {
1073
- case "Disconnected":
1074
- return($this->SetError("connection was not yet established", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1075
- case "Connected":
1076
- $connect = 0;
1077
- break;
1078
- case "ConnectedToProxy":
1079
- if(strlen($error = $this->ConnectFromProxy($arguments, $headers)))
1080
- return($error);
1081
- $connect = 1;
1082
- break;
1083
- default:
1084
- return($this->SetError("can not send request in the current connection state", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1085
- }
1086
- if(IsSet($arguments["RequestMethod"]))
1087
- $this->request_method=$arguments["RequestMethod"];
1088
- if(IsSet($arguments["User-Agent"]))
1089
- $this->user_agent=$arguments["User-Agent"];
1090
- if(!IsSet($arguments["Headers"]["User-Agent"])
1091
- && strlen($this->user_agent))
1092
- $arguments["Headers"]["User-Agent"]=$this->user_agent;
1093
- if(IsSet($arguments["KeepAlive"]))
1094
- $this->keep_alive=intval($arguments["KeepAlive"]);
1095
- if(!IsSet($arguments["Headers"]["Connection"])
1096
- && $this->keep_alive)
1097
- $arguments["Headers"]["Connection"]='Keep-Alive';
1098
- if(IsSet($arguments["Accept"]))
1099
- $this->user_agent=$arguments["Accept"];
1100
- if(!IsSet($arguments["Headers"]["Accept"])
1101
- && strlen($this->accept))
1102
- $arguments["Headers"]["Accept"]=$this->accept;
1103
- if(strlen($this->request_method)==0)
1104
- return($this->SetError("it was not specified a valid request method", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1105
- if(IsSet($arguments["RequestURI"]))
1106
- $this->request_uri=$arguments["RequestURI"];
1107
- if(strlen($this->request_uri)==0
1108
- || substr($this->request_uri,0,1)!="/")
1109
- return($this->SetError("it was not specified a valid request URI", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1110
- $this->request_arguments=$arguments;
1111
- $this->request_headers=(IsSet($arguments["Headers"]) ? $arguments["Headers"] : array());
1112
- $body_length=0;
1113
- $this->request_body="";
1114
- $get_body=1;
1115
- if($this->request_method=="POST"
1116
- || $this->request_method=="PUT")
1117
- {
1118
- if(IsSet($arguments['StreamRequest']))
1119
- {
1120
- $get_body = 0;
1121
- $this->request_headers["Transfer-Encoding"]="chunked";
1122
- }
1123
- elseif(IsSet($arguments["PostFiles"])
1124
- || ($this->force_multipart_form_post
1125
- && IsSet($arguments["PostValues"])))
1126
- {
1127
- $boundary="--".md5(uniqid(time()));
1128
- $this->request_headers["Content-Type"]="multipart/form-data; boundary=".$boundary.(IsSet($arguments["CharSet"]) ? "; charset=".$arguments["CharSet"] : "");
1129
- $post_parts=array();
1130
- if(IsSet($arguments["PostValues"]))
1131
- {
1132
- $values=$arguments["PostValues"];
1133
- if(GetType($values)!="array")
1134
- return($this->SetError("it was not specified a valid POST method values array", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1135
- for(Reset($values),$value=0;$value<count($values);Next($values),$value++)
1136
- {
1137
- $input=Key($values);
1138
- $headers="--".$boundary."\r\nContent-Disposition: form-data; name=\"".$input."\"\r\n\r\n";
1139
- $data=$values[$input];
1140
- $post_parts[]=array("HEADERS"=>$headers,"DATA"=>$data);
1141
- $body_length+=strlen($headers)+strlen($data)+strlen("\r\n");
1142
- }
1143
- }
1144
- $body_length+=strlen("--".$boundary."--\r\n");
1145
- $files=(IsSet($arguments["PostFiles"]) ? $arguments["PostFiles"] : array());
1146
- Reset($files);
1147
- $end=(GetType($input=Key($files))!="string");
1148
- for(;!$end;)
1149
- {
1150
- if(strlen($error=$this->GetFileDefinition($files[$input],$definition)))
1151
- return("3 ".$error);
1152
- $headers="--".$boundary."\r\nContent-Disposition: form-data; name=\"".$input."\"; filename=\"".$definition["NAME"]."\"\r\nContent-Type: ".$definition["Content-Type"]."\r\n\r\n";
1153
- $part=count($post_parts);
1154
- $post_parts[$part]=array("HEADERS"=>$headers);
1155
- if(IsSet($definition["FILENAME"]))
1156
- {
1157
- $post_parts[$part]["FILENAME"]=$definition["FILENAME"];
1158
- $data="";
1159
- }
1160
- else
1161
- $data=$definition["DATA"];
1162
- $post_parts[$part]["DATA"]=$data;
1163
- $body_length+=strlen($headers)+$definition["Content-Length"]+strlen("\r\n");
1164
- Next($files);
1165
- $end=(GetType($input=Key($files))!="string");
1166
- }
1167
- $get_body=0;
1168
- }
1169
- elseif(IsSet($arguments["PostValues"]))
1170
- {
1171
- $values=$arguments["PostValues"];
1172
- if(GetType($values)!="array")
1173
- return($this->SetError("it was not specified a valid POST method values array", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1174
- for(Reset($values),$value=0;$value<count($values);Next($values),$value++)
1175
- {
1176
- $k=Key($values);
1177
- if(GetType($values[$k])=="array")
1178
- {
1179
- for($v = 0; $v < count($values[$k]); $v++)
1180
- {
1181
- if($value+$v>0)
1182
- $this->request_body.="&";
1183
- $this->request_body.=UrlEncode($k)."=".UrlEncode($values[$k][$v]);
1184
- }
1185
- }
1186
- else
1187
- {
1188
- if($value>0)
1189
- $this->request_body.="&";
1190
- $this->request_body.=UrlEncode($k)."=".UrlEncode($values[$k]);
1191
- }
1192
- }
1193
- $this->request_headers["Content-Type"]="application/x-www-form-urlencoded".(IsSet($arguments["CharSet"]) ? "; charset=".$arguments["CharSet"] : "");
1194
- $get_body=0;
1195
- }
1196
- }
1197
- if($get_body
1198
- && (IsSet($arguments["Body"])
1199
- || IsSet($arguments["BodyStream"])))
1200
- {
1201
- if(IsSet($arguments["Body"]))
1202
- $this->request_body=$arguments["Body"];
1203
- else
1204
- {
1205
- $stream=$arguments["BodyStream"];
1206
- $this->request_body="";
1207
- for($part=0; $part<count($stream); $part++)
1208
- {
1209
- if(IsSet($stream[$part]["Data"]))
1210
- $this->request_body.=$stream[$part]["Data"];
1211
- elseif(IsSet($stream[$part]["File"]))
1212
- {
1213
- if(!($file=@fopen($stream[$part]["File"],"rb")))
1214
- return($this->SetPHPError("could not open upload file ".$stream[$part]["File"], HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE));
1215
- while(!feof($file))
1216
- {
1217
- if(GetType($block=@fread($file,$this->file_buffer_length))!="string")
1218
- {
1219
- $error=$this->SetPHPError("could not read body stream file ".$stream[$part]["File"], HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
1220
- fclose($file);
1221
- return($error);
1222
- }
1223
- $this->request_body.=$block;
1224
- }
1225
- fclose($file);
1226
- }
1227
- else
1228
- return("5 it was not specified a valid file or data body stream element at position ".$part);
1229
- }
1230
- }
1231
- if(!IsSet($this->request_headers["Content-Type"]))
1232
- $this->request_headers["Content-Type"]="application/octet-stream".(IsSet($arguments["CharSet"]) ? "; charset=".$arguments["CharSet"] : "");
1233
- }
1234
- if(IsSet($arguments["AuthUser"]))
1235
- $this->request_user=$arguments["AuthUser"];
1236
- elseif(IsSet($this->user))
1237
- $this->request_user=$this->user;
1238
- if(IsSet($arguments["AuthPassword"]))
1239
- $this->request_password=$arguments["AuthPassword"];
1240
- elseif(IsSet($this->password))
1241
- $this->request_password=$this->password;
1242
- if(IsSet($arguments["AuthRealm"]))
1243
- $this->request_realm=$arguments["AuthRealm"];
1244
- elseif(IsSet($this->realm))
1245
- $this->request_realm=$this->realm;
1246
- if(IsSet($arguments["AuthWorkstation"]))
1247
- $this->request_workstation=$arguments["AuthWorkstation"];
1248
- elseif(IsSet($this->workstation))
1249
- $this->request_workstation=$this->workstation;
1250
- if(strlen($this->proxy_host_name)==0
1251
- || $connect)
1252
- $request_uri=$this->request_uri;
1253
- else
1254
- {
1255
- switch(strtolower($this->protocol))
1256
- {
1257
- case "http":
1258
- $default_port=80;
1259
- break;
1260
- case "https":
1261
- $default_port=443;
1262
- break;
1263
- }
1264
- $request_uri=strtolower($this->protocol)."://".$this->host_name.(($this->host_port==0 || $this->host_port==$default_port) ? "" : ":".$this->host_port).$this->request_uri;
1265
- }
1266
- if($this->use_curl)
1267
- {
1268
- $version=(GetType($v=curl_version())=="array" ? (IsSet($v["version"]) ? $v["version"] : "0.0.0") : (preg_match("/^libcurl\\/([0-9]+\\.[0-9]+\\.[0-9]+)/",$v,$m) ? $m[1] : "0.0.0"));
1269
- $curl_version=100000*intval($this->Tokenize($version,"."))+1000*intval($this->Tokenize("."))+intval($this->Tokenize(""));
1270
- $protocol_version=($curl_version<713002 ? "1.0" : $this->protocol_version);
1271
- }
1272
- else
1273
- $protocol_version=$this->protocol_version;
1274
- $this->request=$this->request_method." ".$request_uri." HTTP/".$protocol_version;
1275
- if($body_length
1276
- || ($body_length=strlen($this->request_body))
1277
- || !strcmp($this->request_method, 'POST'))
1278
- $this->request_headers["Content-Length"]=$body_length;
1279
- for($headers=array(),$host_set=0,Reset($this->request_headers),$header=0;$header<count($this->request_headers);Next($this->request_headers),$header++)
1280
- {
1281
- $header_name=Key($this->request_headers);
1282
- $header_value=$this->request_headers[$header_name];
1283
- if(GetType($header_value)=="array")
1284
- {
1285
- for(Reset($header_value),$value=0;$value<count($header_value);Next($header_value),$value++)
1286
- $headers[]=$header_name.": ".$header_value[Key($header_value)];
1287
- }
1288
- else
1289
- $headers[]=$header_name.": ".$header_value;
1290
- if(strtolower(Key($this->request_headers))=="host")
1291
- {
1292
- $this->request_host=strtolower($header_value);
1293
- $host_set=1;
1294
- }
1295
- }
1296
- if(!$host_set)
1297
- {
1298
- $headers[]="Host: ".$this->host_name;
1299
- $this->request_host=strtolower($this->host_name);
1300
- }
1301
- if(count($this->cookies))
1302
- {
1303
- $cookies=array();
1304
- $this->PickCookies($cookies,0);
1305
- if(strtolower($this->protocol)=="https")
1306
- $this->PickCookies($cookies,1);
1307
- if(count($cookies))
1308
- {
1309
- $h=count($headers);
1310
- $headers[$h]="Cookie:";
1311
- for(Reset($cookies),$cookie=0;$cookie<count($cookies);Next($cookies),$cookie++)
1312
- {
1313
- $cookie_name=Key($cookies);
1314
- $headers[$h].=" ".$cookie_name."=".$cookies[$cookie_name]["value"].";";
1315
- }
1316
- }
1317
- }
1318
- $next_state = "RequestSent";
1319
- if($this->use_curl)
1320
- {
1321
- if(IsSet($arguments['StreamRequest']))
1322
- return($this->SetError("Streaming request data is not supported when using Curl", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1323
- if($body_length
1324
- && strlen($this->request_body)==0)
1325
- {
1326
- for($request_body="",$success=1,$part=0;$part<count($post_parts);$part++)
1327
- {
1328
- $request_body.=$post_parts[$part]["HEADERS"].$post_parts[$part]["DATA"];
1329
- if(IsSet($post_parts[$part]["FILENAME"]))
1330
- {
1331
- if(!($file=@fopen($post_parts[$part]["FILENAME"],"rb")))
1332
- {
1333
- $this->SetPHPError("could not open upload file ".$post_parts[$part]["FILENAME"], HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
1334
- $success=0;
1335
- break;
1336
- }
1337
- while(!feof($file))
1338
- {
1339
- if(GetType($block=@fread($file,$this->file_buffer_length))!="string")
1340
- {
1341
- $this->SetPHPError("could not read upload file", HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
1342
- $success=0;
1343
- break;
1344
- }
1345
- $request_body.=$block;
1346
- }
1347
- fclose($file);
1348
- if(!$success)
1349
- break;
1350
- }
1351
- $request_body.="\r\n";
1352
- }
1353
- $request_body.="--".$boundary."--\r\n";
1354
- }
1355
- else
1356
- $request_body=$this->request_body;
1357
- curl_setopt($this->connection,CURLOPT_HEADER,1);
1358
- curl_setopt($this->connection,CURLOPT_RETURNTRANSFER,1);
1359
- if($this->timeout)
1360
- curl_setopt($this->connection,CURLOPT_TIMEOUT,$this->timeout);
1361
- curl_setopt($this->connection,CURLOPT_SSL_VERIFYPEER,0);
1362
- curl_setopt($this->connection,CURLOPT_SSL_VERIFYHOST,0);
1363
- $request=$this->request."\r\n".implode("\r\n",$headers)."\r\n\r\n".$request_body;
1364
- curl_setopt($this->connection,CURLOPT_CUSTOMREQUEST,$request);
1365
- if($this->debug)
1366
- $this->OutputDebug("C ".$request);
1367
- if(!($success=(strlen($this->response=curl_exec($this->connection))!=0)))
1368
- {
1369
- $error=curl_error($this->connection);
1370
- $this->SetError("Could not execute the request".(strlen($error) ? ": ".$error : ""), HTTP_CLIENT_ERROR_PROTOCOL_FAILURE);
1371
- }
1372
- }
1373
- else
1374
- {
1375
- if(($success=$this->PutLine($this->request)))
1376
- {
1377
- for($header=0;$header<count($headers);$header++)
1378
- {
1379
- if(!$success=$this->PutLine($headers[$header]))
1380
- break;
1381
- }
1382
- if($success
1383
- && ($success=$this->PutLine("")))
1384
- {
1385
- if(IsSet($arguments['StreamRequest']))
1386
- $next_state = "SendingRequestBody";
1387
- elseif($body_length)
1388
- {
1389
- if(strlen($this->request_body))
1390
- $success=$this->PutData($this->request_body);
1391
- else
1392
- {
1393
- for($part=0;$part<count($post_parts);$part++)
1394
- {
1395
- if(!($success=$this->PutData($post_parts[$part]["HEADERS"]))
1396
- || !($success=$this->PutData($post_parts[$part]["DATA"])))
1397
- break;
1398
- if(IsSet($post_parts[$part]["FILENAME"]))
1399
- {
1400
- if(!($file=@fopen($post_parts[$part]["FILENAME"],"rb")))
1401
- {
1402
- $this->SetPHPError("could not open upload file ".$post_parts[$part]["FILENAME"], HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
1403
- $success=0;
1404
- break;
1405
- }
1406
- while(!feof($file))
1407
- {
1408
- if(GetType($block=@fread($file,$this->file_buffer_length))!="string")
1409
- {
1410
- $this->SetPHPError("could not read upload file", HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
1411
- $success=0;
1412
- break;
1413
- }
1414
- if(!($success=$this->PutData($block)))
1415
- break;
1416
- }
1417
- fclose($file);
1418
- if(!$success)
1419
- break;
1420
- }
1421
- if(!($success=$this->PutLine("")))
1422
- break;
1423
- }
1424
- if($success)
1425
- $success=$this->PutLine("--".$boundary."--");
1426
- }
1427
- if($success)
1428
- $sucess=$this->FlushData();
1429
- }
1430
- }
1431
- }
1432
- }
1433
- if(!$success)
1434
- return($this->SetError("could not send the HTTP request: ".$this->error, $this->error_code));
1435
- $this->state=$next_state;
1436
- return("");
1437
- }
1438
-
1439
- Function SetCookie($name, $value, $expires="" , $path="/" , $domain="" , $secure=0, $verbatim=0)
1440
- {
1441
- if(strlen($this->error))
1442
- return($this->error);
1443
- if(strlen($name)==0)
1444
- return($this->SetError("it was not specified a valid cookie name", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1445
- if(strlen($path)==0
1446
- || strcmp($path[0],"/"))
1447
- return($this->SetError($path." is not a valid path for setting cookie ".$name, HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1448
- if($domain==""
1449
- || !strpos($domain,".",$domain[0]=="." ? 1 : 0))
1450
- return($this->SetError($domain." is not a valid domain for setting cookie ".$name, HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1451
- $domain=strtolower($domain);
1452
- if(!strcmp($domain[0],"."))
1453
- $domain=substr($domain,1);
1454
- if(!$verbatim)
1455
- {
1456
- $name=$this->CookieEncode($name,1);
1457
- $value=$this->CookieEncode($value,0);
1458
- }
1459
- $secure=intval($secure);
1460
- $this->cookies[$secure][$domain][$path][$name]=array(
1461
- "name"=>$name,
1462
- "value"=>$value,
1463
- "domain"=>$domain,
1464
- "path"=>$path,
1465
- "expires"=>$expires,
1466
- "secure"=>$secure
1467
- );
1468
- return("");
1469
- }
1470
-
1471
- Function SendRequestBody($data, $end_of_data)
1472
- {
1473
- if(strlen($this->error))
1474
- return($this->error);
1475
- switch($this->state)
1476
- {
1477
- case "Disconnected":
1478
- return($this->SetError("connection was not yet established", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1479
- case "Connected":
1480
- case "ConnectedToProxy":
1481
- return($this->SetError("request was not sent", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1482
- case "SendingRequestBody":
1483
- break;
1484
- case "RequestSent":
1485
- return($this->SetError("request body was already sent", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1486
- default:
1487
- return($this->SetError("can not send the request body in the current connection state", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1488
- }
1489
- $length = strlen($data);
1490
- if($length)
1491
- {
1492
- $size = dechex($length)."\r\n";
1493
- if(!$this->PutData($size)
1494
- || !$this->PutData($data))
1495
- return($this->error);
1496
- }
1497
- if($end_of_data)
1498
- {
1499
- $size = "0\r\n";
1500
- if(!$this->PutData($size))
1501
- return($this->error);
1502
- $this->state = "RequestSent";
1503
- }
1504
- return("");
1505
- }
1506
-
1507
- Function ReadReplyHeadersResponse(&$headers)
1508
- {
1509
- $headers=array();
1510
- if(strlen($this->error))
1511
- return($this->error);
1512
- switch($this->state)
1513
- {
1514
- case "Disconnected":
1515
- return($this->SetError("connection was not yet established", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1516
- case "Connected":
1517
- return($this->SetError("request was not sent", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1518
- case "ConnectedToProxy":
1519
- return($this->SetError("connection from the remote server from the proxy was not yet established", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1520
- case "SendingRequestBody":
1521
- return($this->SetError("request body data was not completely sent", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1522
- case "ConnectSent":
1523
- $connect = 1;
1524
- break;
1525
- case "RequestSent":
1526
- $connect = 0;
1527
- break;
1528
- default:
1529
- return($this->SetError("can not get request headers in the current connection state", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1530
- }
1531
- $this->content_length=$this->read_length=$this->read_response=$this->remaining_chunk=0;
1532
- $this->content_length_set=$this->chunked=$this->last_chunk_read=$chunked=0;
1533
- $this->force_close = $this->connection_close=0;
1534
- for($this->response_status="";;)
1535
- {
1536
- $line=$this->GetLine();
1537
- if(GetType($line)!="string")
1538
- return($this->SetError("could not read request reply: ".$this->error, $this->error_code));
1539
- if(strlen($this->response_status)==0)
1540
- {
1541
- if(!preg_match($match="/^http\\/[0-9]+\\.[0-9]+[ \t]+([0-9]+)[ \t]*(.*)\$/i",$line,$matches))
1542
- return($this->SetError("it was received an unexpected HTTP response status", HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1543
- $this->response_status=$matches[1];
1544
- $this->response_message=$matches[2];
1545
- if($this->response_status == 204)
1546
- {
1547
- $this->content_length = 0;
1548
- $this->content_length_set = 1;
1549
- }
1550
- }
1551
- if($line=="")
1552
- {
1553
- if(strlen($this->response_status)==0)
1554
- return($this->SetError("it was not received HTTP response status", HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1555
- $this->state=($connect ? "GotConnectHeaders" : "GotReplyHeaders");
1556
- break;
1557
- }
1558
- $header_name=strtolower($this->Tokenize($line,":"));
1559
- $header_value=Trim(Chop($this->Tokenize("\r\n")));
1560
- if(IsSet($headers[$header_name]))
1561
- {
1562
- if(GetType($headers[$header_name])=="string")
1563
- $headers[$header_name]=array($headers[$header_name]);
1564
- $headers[$header_name][]=$header_value;
1565
- }
1566
- else
1567
- $headers[$header_name]=$header_value;
1568
- if(!$connect)
1569
- {
1570
- switch($header_name)
1571
- {
1572
- case "content-length":
1573
- $this->content_length=intval($headers[$header_name]);
1574
- $this->content_length_set=1;
1575
- break;
1576
- case "transfer-encoding":
1577
- $encoding=$this->Tokenize($header_value,"; \t");
1578
- if(!$this->use_curl
1579
- && !strcmp($encoding,"chunked"))
1580
- $chunked=1;
1581
- break;
1582
- case "set-cookie":
1583
- if($this->support_cookies)
1584
- {
1585
- if(GetType($headers[$header_name])=="array")
1586
- $cookie_headers=$headers[$header_name];
1587
- else
1588
- $cookie_headers=array($headers[$header_name]);
1589
- for($cookie=0;$cookie<count($cookie_headers);$cookie++)
1590
- {
1591
- $cookie_name=trim($this->Tokenize($cookie_headers[$cookie],"="));
1592
- $cookie_value=$this->Tokenize(";");
1593
- $domain=$this->request_host;
1594
- $path="/";
1595
- $expires="";
1596
- $secure=0;
1597
- while(($name = strtolower(trim(UrlDecode($this->Tokenize("=")))))!="")
1598
- {
1599
- $value=UrlDecode($this->Tokenize(";"));
1600
- switch($name)
1601
- {
1602
- case "domain":
1603
- $domain=$value;
1604
- break;
1605
- case "path":
1606
- $path=$value;
1607
- break;
1608
- case "expires":
1609
- if(preg_match("/^((Mon|Monday|Tue|Tuesday|Wed|Wednesday|Thu|Thursday|Fri|Friday|Sat|Saturday|Sun|Sunday), )?([0-9]{2})\\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\-([0-9]{2,4}) ([0-9]{2})\\:([0-9]{2})\\:([0-9]{2}) GMT\$/",$value,$matches))
1610
- {
1611
- $year=intval($matches[5]);
1612
- if($year<1900)
1613
- $year+=($year<70 ? 2000 : 1900);
1614
- $expires="$year-".$this->months[$matches[4]]."-".$matches[3]." ".$matches[6].":".$matches[7].":".$matches[8];
1615
- }
1616
- break;
1617
- case "secure":
1618
- $secure=1;
1619
- break;
1620
- }
1621
- }
1622
- if(strlen($this->SetCookie($cookie_name, $cookie_value, $expires, $path , $domain, $secure, 1)))
1623
- $this->error="";
1624
- }
1625
- }
1626
- break;
1627
- case "connection":
1628
- $this->force_close = $this->connection_close=!strcmp(strtolower($header_value),"close");
1629
- break;
1630
- }
1631
- }
1632
- }
1633
- $this->chunked=$chunked;
1634
- if($this->content_length_set)
1635
- $this->connection_close=0;
1636
- return("");
1637
- }
1638
-
1639
- Function Redirect(&$headers)
1640
- {
1641
- if($this->follow_redirect)
1642
- {
1643
- if(!IsSet($headers["location"])
1644
- || (GetType($headers["location"])!="array"
1645
- && strlen($location=$headers["location"])==0)
1646
- || (GetType($headers["location"])=="array"
1647
- && strlen($location=$headers["location"][0])==0))
1648
- return($this->SetError("it was received a redirect without location URL", HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1649
- if(strcmp($location[0],"/"))
1650
- {
1651
- if(!($location_arguments=@parse_url($location)))
1652
- return($this->SetError("the server did not return a valid redirection location URL", HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1653
- if(!IsSet($location_arguments["scheme"]))
1654
- $location=((GetType($end=strrpos($this->request_uri,"/"))=="integer" && $end>1) ? substr($this->request_uri,0,$end) : "")."/".$location;
1655
- }
1656
- if(!strcmp($location[0],"/"))
1657
- $location=$this->protocol."://".$this->host_name.($this->host_port ? ":".$this->host_port : "").$location;
1658
- $error=$this->GetRequestArguments($location,$arguments);
1659
- if(strlen($error))
1660
- return($this->SetError("could not process redirect url: ".$error, HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1661
- $arguments["RequestMethod"]="GET";
1662
- if(strlen($error=$this->Close())==0
1663
- && strlen($error=$this->Open($arguments))==0
1664
- && strlen($error=$this->SendRequest($arguments))==0)
1665
- {
1666
- $this->redirection_level++;
1667
- if($this->redirection_level>$this->redirection_limit)
1668
- {
1669
- $error="it was exceeded the limit of request redirections";
1670
- $this->error_code = HTTP_CLIENT_ERROR_PROTOCOL_FAILURE;
1671
- }
1672
- else
1673
- $error=$this->ReadReplyHeaders($headers);
1674
- $this->redirection_level--;
1675
- }
1676
- if(strlen($error))
1677
- return($this->SetError($error, $this->error_code));
1678
- }
1679
- return("");
1680
- }
1681
-
1682
- Function Authenticate(&$headers, $proxy, &$proxy_authorization, &$user, &$password, &$realm, &$workstation)
1683
- {
1684
- if($proxy)
1685
- {
1686
- $authenticate_header="proxy-authenticate";
1687
- $authorization_header="Proxy-Authorization";
1688
- $authenticate_status="407";
1689
- $authentication_mechanism=$this->proxy_authentication_mechanism;
1690
- }
1691
- else
1692
- {
1693
- $authenticate_header="www-authenticate";
1694
- $authorization_header="Authorization";
1695
- $authenticate_status="401";
1696
- $authentication_mechanism=$this->authentication_mechanism;
1697
- }
1698
- if(IsSet($headers[$authenticate_header])
1699
- && $this->sasl_authenticate)
1700
- {
1701
- if(function_exists("class_exists")
1702
- && !class_exists("sasl_client_class"))
1703
- return($this->SetError("the SASL client class needs to be loaded to be able to authenticate".($proxy ? " with the proxy server" : "")." and access this site", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1704
- if(GetType($headers[$authenticate_header])=="array")
1705
- $authenticate=$headers[$authenticate_header];
1706
- else
1707
- $authenticate=array($headers[$authenticate_header]);
1708
- for($response="", $mechanisms=array(),$m=0;$m<count($authenticate);$m++)
1709
- {
1710
- $mechanism=$this->Tokenize($authenticate[$m]," ");
1711
- $response=$this->Tokenize("");
1712
- if(strlen($authentication_mechanism))
1713
- {
1714
- if(!strcmp($authentication_mechanism,$mechanism))
1715
- {
1716
- $mechanisms[]=$mechanism;
1717
- break;
1718
- }
1719
- }
1720
- else
1721
- $mechanisms[]=$mechanism;
1722
- }
1723
- $sasl=new sasl_client_class;
1724
- if(IsSet($user))
1725
- $sasl->SetCredential("user",$user);
1726
- if(IsSet($password))
1727
- $sasl->SetCredential("password",$password);
1728
- if(IsSet($realm))
1729
- $sasl->SetCredential("realm",$realm);
1730
- if(IsSet($workstation))
1731
- $sasl->SetCredential("workstation",$workstation);
1732
- $sasl->SetCredential("uri",$this->request_uri);
1733
- $sasl->SetCredential("method",$this->request_method);
1734
- $sasl->SetCredential("session",$this->session);
1735
- do
1736
- {
1737
- $status=$sasl->Start($mechanisms,$message,$interactions);
1738
- }
1739
- while($status==SASL_INTERACT);
1740
- switch($status)
1741
- {
1742
- case SASL_CONTINUE:
1743
- break;
1744
- case SASL_NOMECH:
1745
- return($this->SetError(($proxy ? "proxy " : "")."authentication error: ".(strlen($authentication_mechanism) ? "authentication mechanism ".$authentication_mechanism." may not be used: " : "").$sasl->error, HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1746
- default:
1747
- return($this->SetError("Could not start the SASL ".($proxy ? "proxy " : "")."authentication client: ".$sasl->error, HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1748
- }
1749
- if($proxy >= 0)
1750
- {
1751
- for(;;)
1752
- {
1753
- if(strlen($error=$this->ReadReplyBody($body,$this->file_buffer_length)))
1754
- return($error);
1755
- if(strlen($body)==0)
1756
- break;
1757
- }
1758
- }
1759
- $authorization_value=$sasl->mechanism.(IsSet($message) ? " ".($sasl->encode_response ? base64_encode($message) : $message) : "");
1760
- $request_arguments=$this->request_arguments;
1761
- $arguments=$request_arguments;
1762
- $arguments["Headers"][$authorization_header]=$authorization_value;
1763
- if(!$proxy
1764
- && strlen($proxy_authorization))
1765
- $arguments["Headers"]["Proxy-Authorization"]=$proxy_authorization;
1766
- if(strlen($error=$this->Close())
1767
- || strlen($error=$this->Open($arguments)))
1768
- return($this->SetError($error, $this->error_code));
1769
- $authenticated=0;
1770
- if(IsSet($message))
1771
- {
1772
- if($proxy < 0)
1773
- {
1774
- if(strlen($error=$this->ConnectFromProxy($arguments, $headers)))
1775
- return($this->SetError($error, $this->error_code));
1776
- }
1777
- else
1778
- {
1779
- if(strlen($error=$this->SendRequest($arguments))
1780
- || strlen($error=$this->ReadReplyHeadersResponse($headers)))
1781
- return($this->SetError($error, $this->error_code));
1782
- }
1783
- if(!IsSet($headers[$authenticate_header]))
1784
- $authenticate=array();
1785
- elseif(GetType($headers[$authenticate_header])=="array")
1786
- $authenticate=$headers[$authenticate_header];
1787
- else
1788
- $authenticate=array($headers[$authenticate_header]);
1789
- for($mechanism=0;$mechanism<count($authenticate);$mechanism++)
1790
- {
1791
- if(!strcmp($this->Tokenize($authenticate[$mechanism]," "),$sasl->mechanism))
1792
- {
1793
- $response=$this->Tokenize("");
1794
- break;
1795
- }
1796
- }
1797
- switch($this->response_status)
1798
- {
1799
- case $authenticate_status:
1800
- break;
1801
- case "301":
1802
- case "302":
1803
- case "303":
1804
- case "307":
1805
- if($proxy >= 0)
1806
- return($this->Redirect($headers));
1807
- default:
1808
- if(intval($this->response_status/100)==2)
1809
- {
1810
- if($proxy)
1811
- $proxy_authorization=$authorization_value;
1812
- $authenticated=1;
1813
- break;
1814
- }
1815
- if($proxy
1816
- && !strcmp($this->response_status,"401"))
1817
- {
1818
- $proxy_authorization=$authorization_value;
1819
- $authenticated=1;
1820
- break;
1821
- }
1822
- return($this->SetError(($proxy ? "proxy " : "")."authentication error: ".$this->response_status." ".$this->response_message, HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1823
- }
1824
- }
1825
- for(;!$authenticated;)
1826
- {
1827
- do
1828
- {
1829
- $status=$sasl->Step($response,$message,$interactions);
1830
- }
1831
- while($status==SASL_INTERACT);
1832
- switch($status)
1833
- {
1834
- case SASL_CONTINUE:
1835
- $authorization_value=$sasl->mechanism.(IsSet($message) ? " ".($sasl->encode_response ? base64_encode($message) : $message) : "");
1836
- $arguments=$request_arguments;
1837
- $arguments["Headers"][$authorization_header]=$authorization_value;
1838
- if(!$proxy
1839
- && strlen($proxy_authorization))
1840
- $arguments["Headers"]["Proxy-Authorization"]=$proxy_authorization;
1841
- if($proxy < 0)
1842
- {
1843
- if(strlen($error=$this->ConnectFromProxy($arguments, $headers)))
1844
- return($this->SetError($error, $this->error_code));
1845
- }
1846
- else
1847
- {
1848
- if(strlen($error=$this->SendRequest($arguments))
1849
- || strlen($error=$this->ReadReplyHeadersResponse($headers)))
1850
- return($this->SetError($error, $this->error_code));
1851
- }
1852
- switch($this->response_status)
1853
- {
1854
- case $authenticate_status:
1855
- if(GetType($headers[$authenticate_header])=="array")
1856
- $authenticate=$headers[$authenticate_header];
1857
- else
1858
- $authenticate=array($headers[$authenticate_header]);
1859
- for($response="",$mechanism=0;$mechanism<count($authenticate);$mechanism++)
1860
- {
1861
- if(!strcmp($this->Tokenize($authenticate[$mechanism]," "),$sasl->mechanism))
1862
- {
1863
- $response=$this->Tokenize("");
1864
- break;
1865
- }
1866
- }
1867
- if($proxy >= 0)
1868
- {
1869
- for(;;)
1870
- {
1871
- if(strlen($error=$this->ReadReplyBody($body,$this->file_buffer_length)))
1872
- return($error);
1873
- if(strlen($body)==0)
1874
- break;
1875
- }
1876
- }
1877
- $this->state="Connected";
1878
- break;
1879
- case "301":
1880
- case "302":
1881
- case "303":
1882
- case "307":
1883
- if($proxy >= 0)
1884
- return($this->Redirect($headers));
1885
- default:
1886
- if(intval($this->response_status/100)==2)
1887
- {
1888
- if($proxy)
1889
- $proxy_authorization=$authorization_value;
1890
- $authenticated=1;
1891
- break;
1892
- }
1893
- if($proxy
1894
- && !strcmp($this->response_status,"401"))
1895
- {
1896
- $proxy_authorization=$authorization_value;
1897
- $authenticated=1;
1898
- break;
1899
- }
1900
- return($this->SetError(($proxy ? "proxy " : "")."authentication error: ".$this->response_status." ".$this->response_message));
1901
- }
1902
- break;
1903
- default:
1904
- return($this->SetError("Could not process the SASL ".($proxy ? "proxy " : "")."authentication step: ".$sasl->error, HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1905
- }
1906
- }
1907
- }
1908
- return("");
1909
- }
1910
-
1911
- Function ReadReplyHeaders(&$headers)
1912
- {
1913
- if(strlen($error=$this->ReadReplyHeadersResponse($headers)))
1914
- return($error);
1915
- $proxy_authorization="";
1916
- while(!strcmp($this->response_status, "100"))
1917
- {
1918
- $this->state="RequestSent";
1919
- if(strlen($error=$this->ReadReplyHeadersResponse($headers)))
1920
- return($error);
1921
- }
1922
- switch($this->response_status)
1923
- {
1924
- case "301":
1925
- case "302":
1926
- case "303":
1927
- case "307":
1928
- if(strlen($error=$this->Redirect($headers)))
1929
- return($error);
1930
- break;
1931
- case "407":
1932
- if(strlen($error=$this->Authenticate($headers, 1, $proxy_authorization, $this->proxy_request_user, $this->proxy_request_password, $this->proxy_request_realm, $this->proxy_request_workstation)))
1933
- return($error);
1934
- if(strcmp($this->response_status,"401"))
1935
- return("");
1936
- case "401":
1937
- return($this->Authenticate($headers, 0, $proxy_authorization, $this->request_user, $this->request_password, $this->request_realm, $this->request_workstation));
1938
- }
1939
- return("");
1940
- }
1941
-
1942
- Function ReadReplyBody(&$body,$length)
1943
- {
1944
- $body="";
1945
- if(strlen($this->error))
1946
- return($this->error);
1947
- switch($this->state)
1948
- {
1949
- case "Disconnected":
1950
- return($this->SetError("connection was not yet established", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1951
- case "Connected":
1952
- case "ConnectedToProxy":
1953
- return($this->SetError("request was not sent", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1954
- case "RequestSent":
1955
- if(($error=$this->ReadReplyHeaders($headers))!="")
1956
- return($error);
1957
- break;
1958
- case "GotReplyHeaders":
1959
- break;
1960
- case 'ResponseReceived':
1961
- $body = '';
1962
- return('');
1963
- default:
1964
- return($this->SetError("can not get request headers in the current connection state", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1965
- }
1966
- if($this->content_length_set)
1967
- $length=min($this->content_length-$this->read_length,$length);
1968
- $body = '';
1969
- if($length>0)
1970
- {
1971
- if(!$this->EndOfInput()
1972
- && ($body=$this->ReadBytes($length))=="")
1973
- {
1974
- if(strlen($this->error))
1975
- return($this->SetError("could not get the request reply body: ".$this->error, $this->error_code));
1976
- }
1977
- $this->read_length+=strlen($body);
1978
- if($this->EndOfInput())
1979
- $this->state = 'ResponseReceived';
1980
- }
1981
- return("");
1982
- }
1983
-
1984
- Function ReadWholeReplyBody(&$body)
1985
- {
1986
- $body = '';
1987
- for(;;)
1988
- {
1989
- if(strlen($error = $this->ReadReplyBody($block, $this->file_buffer_length)))
1990
- return($error);
1991
- if(strlen($block) == 0)
1992
- return('');
1993
- $body .= $block;
1994
- }
1995
- }
1996
-
1997
- Function ReadWholeReplyIntoTemporaryFile(&$file)
1998
- {
1999
- if(!($file = tmpfile()))
2000
- return $this->SetPHPError('could not create the temporary file to save the response', HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
2001
- for(;;)
2002
- {
2003
- if(strlen($error = $this->ReadReplyBody($block, $this->file_buffer_length)))
2004
- {
2005
- fclose($file);
2006
- return($error);
2007
- }
2008
- if(strlen($block) == 0)
2009
- {
2010
- if(@fseek($file, 0) != 0)
2011
- {
2012
- $error = $this->SetPHPError('could not seek to the beginning of temporary file with the response', HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
2013
- fclose($file);
2014
- return $error;
2015
- }
2016
- return('');
2017
- }
2018
- if(!@fwrite($file, $block))
2019
- {
2020
- $error = $this->SetPHPError('could not write to the temporary file to save the response', HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
2021
- fclose($file);
2022
- return $error;
2023
- }
2024
- }
2025
- }
2026
-
2027
- Function SaveCookies(&$cookies, $domain='', $secure_only=0, $persistent_only=0)
2028
- {
2029
- $now=gmdate("Y-m-d H-i-s");
2030
- $cookies=array();
2031
- for($secure_cookies=0,Reset($this->cookies);$secure_cookies<count($this->cookies);Next($this->cookies),$secure_cookies++)
2032
- {
2033
- $secure=Key($this->cookies);
2034
- if(!$secure_only
2035
- || $secure)
2036
- {
2037
- for($cookie_domain=0,Reset($this->cookies[$secure]);$cookie_domain<count($this->cookies[$secure]);Next($this->cookies[$secure]),$cookie_domain++)
2038
- {
2039
- $domain_pattern=Key($this->cookies[$secure]);
2040
- $match=strlen($domain)-strlen($domain_pattern);
2041
- if(strlen($domain)==0
2042
- || ($match>=0
2043
- && !strcmp($domain_pattern,substr($domain,$match))
2044
- && ($match==0
2045
- || $domain_pattern[0]=="."
2046
- || $domain[$match-1]==".")))
2047
- {
2048
- for(Reset($this->cookies[$secure][$domain_pattern]),$path_part=0;$path_part<count($this->cookies[$secure][$domain_pattern]);Next($this->cookies[$secure][$domain_pattern]),$path_part++)
2049
- {
2050
- $path=Key($this->cookies[$secure][$domain_pattern]);
2051
- for(Reset($this->cookies[$secure][$domain_pattern][$path]),$cookie=0;$cookie<count($this->cookies[$secure][$domain_pattern][$path]);Next($this->cookies[$secure][$domain_pattern][$path]),$cookie++)
2052
- {
2053
- $cookie_name=Key($this->cookies[$secure][$domain_pattern][$path]);
2054
- $expires=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]["expires"];
2055
- if((!$persistent_only
2056
- && strlen($expires)==0)
2057
- || (strlen($expires)
2058
- && strcmp($now,$expires)<0))
2059
- $cookies[$secure][$domain_pattern][$path][$cookie_name]=$this->cookies[$secure][$domain_pattern][$path][$cookie_name];
2060
- }
2061
- }
2062
- }
2063
- }
2064
- }
2065
- }
2066
- }
2067
-
2068
- Function SavePersistentCookies(&$cookies, $domain='', $secure_only=0)
2069
- {
2070
- $this->SaveCookies($cookies, $domain, $secure_only, 1);
2071
- }
2072
-
2073
- Function GetPersistentCookies(&$cookies, $domain='', $secure_only=0)
2074
- {
2075
- $this->SavePersistentCookies($cookies, $domain, $secure_only);
2076
- }
2077
-
2078
- Function RestoreCookies($cookies, $clear=1)
2079
- {
2080
- $new_cookies=($clear ? array() : $this->cookies);
2081
- for($secure_cookies=0, Reset($cookies); $secure_cookies<count($cookies); Next($cookies), $secure_cookies++)
2082
- {
2083
- $secure=Key($cookies);
2084
- if(GetType($secure)!="integer")
2085
- return($this->SetError("invalid cookie secure value type (".serialize($secure).")", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
2086
- for($cookie_domain=0,Reset($cookies[$secure]);$cookie_domain<count($cookies[$secure]);Next($cookies[$secure]),$cookie_domain++)
2087
- {
2088
- $domain_pattern=Key($cookies[$secure]);
2089
- if(GetType($domain_pattern)!="string")
2090
- return($this->SetError("invalid cookie domain value type (".serialize($domain_pattern).")", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
2091
- for(Reset($cookies[$secure][$domain_pattern]),$path_part=0;$path_part<count($cookies[$secure][$domain_pattern]);Next($cookies[$secure][$domain_pattern]),$path_part++)
2092
- {
2093
- $path=Key($cookies[$secure][$domain_pattern]);
2094
- if(GetType($path)!="string"
2095
- || strcmp(substr($path, 0, 1), "/"))
2096
- return($this->SetError("invalid cookie path value type (".serialize($path).")", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
2097
- for(Reset($cookies[$secure][$domain_pattern][$path]),$cookie=0;$cookie<count($cookies[$secure][$domain_pattern][$path]);Next($cookies[$secure][$domain_pattern][$path]),$cookie++)
2098
- {
2099
- $cookie_name=Key($cookies[$secure][$domain_pattern][$path]);
2100
- $expires=$cookies[$secure][$domain_pattern][$path][$cookie_name]["expires"];
2101
- $value=$cookies[$secure][$domain_pattern][$path][$cookie_name]["value"];
2102
- if(GetType($expires)!="string"
2103
- || (strlen($expires)
2104
- && !preg_match("/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\$/", $expires)))
2105
- return($this->SetError("invalid cookie expiry value type (".serialize($expires).")", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
2106
- $new_cookies[$secure][$domain_pattern][$path][$cookie_name]=array(
2107
- "name"=>$cookie_name,
2108
- "value"=>$value,
2109
- "domain"=>$domain_pattern,
2110
- "path"=>$path,
2111
- "expires"=>$expires,
2112
- "secure"=>$secure
2113
- );
2114
- }
2115
- }
2116
- }
2117
- }
2118
- $this->cookies=$new_cookies;
2119
- return("");
2120
- }
2121
- };
2122
- }
2123
-
2124
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
library/oauth.php DELETED
@@ -1,894 +0,0 @@
1
- <?php
2
- // vim: foldmethod=marker
3
-
4
- /* Generic exception class
5
- */
6
- if (!class_exists('OAuthException')) {
7
- class OAuthException extends Exception {
8
- // pass
9
- }
10
- }
11
-
12
- if (!class_exists('OAuthConsumer')) {
13
- class OAuthConsumer {
14
- public $key;
15
- public $secret;
16
-
17
- function __construct($key, $secret, $callback_url=NULL) {
18
- $this->key = $key;
19
- $this->secret = $secret;
20
- $this->callback_url = $callback_url;
21
- }
22
-
23
- function __toString() {
24
- return "OAuthConsumer[key=$this->key,secret=$this->secret]";
25
- }
26
- }
27
- }
28
-
29
- if (!class_exists('OAuthToken')) {
30
- class OAuthToken {
31
- // access tokens and request tokens
32
- public $key;
33
- public $secret;
34
-
35
- /**
36
- * key = the token
37
- * secret = the token secret
38
- */
39
- function __construct($key, $secret) {
40
- $this->key = $key;
41
- $this->secret = $secret;
42
- }
43
-
44
- /**
45
- * generates the basic string serialization of a token that a server
46
- * would respond to request_token and access_token calls with
47
- */
48
- function to_string() {
49
- return "oauth_token=" .
50
- OAuthUtil::urlencode_rfc3986($this->key) .
51
- "&oauth_token_secret=" .
52
- OAuthUtil::urlencode_rfc3986($this->secret);
53
- }
54
-
55
- function __toString() {
56
- return $this->to_string();
57
- }
58
- }
59
- }
60
-
61
- if (!class_exists('OAuthSignatureMethod')) {
62
- /**
63
- * A class for implementing a Signature Method
64
- * See section 9 ("Signing Requests") in the spec
65
- */
66
- abstract class OAuthSignatureMethod {
67
- /**
68
- * Needs to return the name of the Signature Method (ie HMAC-SHA1)
69
- * @return string
70
- */
71
- abstract public function get_name();
72
-
73
- /**
74
- * Build up the signature
75
- * NOTE: The output of this function MUST NOT be urlencoded.
76
- * the encoding is handled in OAuthRequest when the final
77
- * request is serialized
78
- * @param OAuthRequest $request
79
- * @param OAuthConsumer $consumer
80
- * @param OAuthToken $token
81
- * @return string
82
- */
83
- abstract public function build_signature($request, $consumer, $token);
84
-
85
- /**
86
- * Verifies that a given signature is correct
87
- * @param OAuthRequest $request
88
- * @param OAuthConsumer $consumer
89
- * @param OAuthToken $token
90
- * @param string $signature
91
- * @return bool
92
- */
93
- public function check_signature($request, $consumer, $token, $signature) {
94
- $built = $this->build_signature($request, $consumer, $token);
95
- return $built == $signature;
96
- }
97
- }
98
- }
99
-
100
- if (!class_exists('OAuthSignatureMethod_HMAC_SHA1')) {
101
- /**
102
- * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104]
103
- * where the Signature Base String is the text and the key is the concatenated values (each first
104
- * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&'
105
- * character (ASCII code 38) even if empty.
106
- * - Chapter 9.2 ("HMAC-SHA1")
107
- */
108
- class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod {
109
- function get_name() {
110
- return "HMAC-SHA1";
111
- }
112
-
113
- public function build_signature($request, $consumer, $token) {
114
- $base_string = $request->get_signature_base_string();
115
- $request->base_string = $base_string;
116
-
117
- $key_parts = array(
118
- $consumer->secret,
119
- ($token) ? $token->secret : ""
120
- );
121
-
122
- $key_parts = OAuthUtil::urlencode_rfc3986($key_parts);
123
- $key = implode('&', $key_parts);
124
-
125
- return base64_encode(hash_hmac('sha1', $base_string, $key, true));
126
- }
127
- }
128
- }
129
-
130
- if (!class_exists('OAuthSignatureMethod_PLAINTEXT')) {
131
- /**
132
- * The PLAINTEXT method does not provide any security protection and SHOULD only be used
133
- * over a secure channel such as HTTPS. It does not use the Signature Base String.
134
- * - Chapter 9.4 ("PLAINTEXT")
135
- */
136
- class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod {
137
- public function get_name() {
138
- return "PLAINTEXT";
139
- }
140
-
141
- /**
142
- * oauth_signature is set to the concatenated encoded values of the Consumer Secret and
143
- * Token Secret, separated by a '&' character (ASCII code 38), even if either secret is
144
- * empty. The result MUST be encoded again.
145
- * - Chapter 9.4.1 ("Generating Signatures")
146
- *
147
- * Please note that the second encoding MUST NOT happen in the SignatureMethod, as
148
- * OAuthRequest handles this!
149
- */
150
- public function build_signature($request, $consumer, $token) {
151
- $key_parts = array(
152
- $consumer->secret,
153
- ($token) ? $token->secret : ""
154
- );
155
-
156
- $key_parts = OAuthUtil::urlencode_rfc3986($key_parts);
157
- $key = implode('&', $key_parts);
158
- $request->base_string = $key;
159
-
160
- return $key;
161
- }
162
- }
163
- }
164
-
165
- if (!class_exists('OAuthSignatureMethod_RSA_SHA1')) {
166
- /**
167
- * The RSA-SHA1 signature method uses the RSASSA-PKCS1-v1_5 signature algorithm as defined in
168
- * [RFC3447] section 8.2 (more simply known as PKCS#1), using SHA-1 as the hash function for
169
- * EMSA-PKCS1-v1_5. It is assumed that the Consumer has provided its RSA public key in a
170
- * verified way to the Service Provider, in a manner which is beyond the scope of this
171
- * specification.
172
- * - Chapter 9.3 ("RSA-SHA1")
173
- */
174
- abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {
175
- public function get_name() {
176
- return "RSA-SHA1";
177
- }
178
-
179
- // Up to the SP to implement this lookup of keys. Possible ideas are:
180
- // (1) do a lookup in a table of trusted certs keyed off of consumer
181
- // (2) fetch via http using a url provided by the requester
182
- // (3) some sort of specific discovery code based on request
183
- //
184
- // Either way should return a string representation of the certificate
185
- protected abstract function fetch_public_cert(&$request);
186
-
187
- // Up to the SP to implement this lookup of keys. Possible ideas are:
188
- // (1) do a lookup in a table of trusted certs keyed off of consumer
189
- //
190
- // Either way should return a string representation of the certificate
191
- protected abstract function fetch_private_cert(&$request);
192
-
193
- public function build_signature($request, $consumer, $token) {
194
- $base_string = $request->get_signature_base_string();
195
- $request->base_string = $base_string;
196
-
197
- // Fetch the private key cert based on the request
198
- $cert = $this->fetch_private_cert($request);
199
-
200
- // Pull the private key ID from the certificate
201
- $privatekeyid = openssl_get_privatekey($cert);
202
-
203
- // Sign using the key
204
- $ok = openssl_sign($base_string, $signature, $privatekeyid);
205
-
206
- // Release the key resource
207
- openssl_free_key($privatekeyid);
208
-
209
- return base64_encode($signature);
210
- }
211
-
212
- public function check_signature($request, $consumer, $token, $signature) {
213
- $decoded_sig = base64_decode($signature);
214
-
215
- $base_string = $request->get_signature_base_string();
216
-
217
- // Fetch the public key cert based on the request
218
- $cert = $this->fetch_public_cert($request);
219
-
220
- // Pull the public key ID from the certificate
221
- $publickeyid = openssl_get_publickey($cert);
222
-
223
- // Check the computed signature against the one passed in the query
224
- $ok = openssl_verify($base_string, $decoded_sig, $publickeyid);
225
-
226
- // Release the key resource
227
- openssl_free_key($publickeyid);
228
-
229
- return $ok == 1;
230
- }
231
- }
232
- }
233
-
234
- if (!class_exists('OAuthRequest')) {
235
- class OAuthRequest {
236
- private $parameters;
237
- private $http_method;
238
- private $http_url;
239
- // for debug purposes
240
- public $base_string;
241
- public static $version = '1.0';
242
- public static $POST_INPUT = 'php://input';
243
-
244
- function __construct($http_method, $http_url, $parameters=NULL) {
245
- @$parameters or $parameters = array();
246
- $parameters = array_merge( OAuthUtil::parse_parameters(parse_url($http_url, PHP_URL_QUERY)), $parameters);
247
- $this->parameters = $parameters;
248
- $this->http_method = $http_method;
249
- $this->http_url = $http_url;
250
- }
251
-
252
-
253
- /**
254
- * attempt to build up a request from what was passed to the server
255
- */
256
- public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {
257
- $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on")
258
- ? 'http'
259
- : 'https';
260
- @$http_url or $http_url = $scheme .
261
- '://' . $_SERVER['HTTP_HOST'] .
262
- ':' .
263
- $_SERVER['SERVER_PORT'] .
264
- html_entity_decode(esc_url($_SERVER['REQUEST_URI']));
265
- @$http_method or $http_method = $_SERVER['REQUEST_METHOD'];
266
-
267
- // We weren't handed any parameters, so let's find the ones relevant to
268
- // this request.
269
- // If you run XML-RPC or similar you should use this to provide your own
270
- // parsed parameter-list
271
- if (!$parameters) {
272
- // Find request headers
273
- $request_headers = OAuthUtil::get_headers();
274
-
275
- // Parse the query-string to find GET parameters
276
- $parameters = OAuthUtil::parse_parameters($_SERVER['QUERY_STRING']);
277
-
278
- // It's a POST request of the proper content-type, so parse POST
279
- // parameters and add those overriding any duplicates from GET
280
- if ($http_method == "POST"
281
- && @strstr($request_headers["Content-Type"],
282
- "application/x-www-form-urlencoded")
283
- ) {
284
- $post_data = OAuthUtil::parse_parameters(
285
- file_get_contents(self::$POST_INPUT)
286
- );
287
- $parameters = array_merge($parameters, $post_data);
288
- }
289
-
290
- // We have a Authorization-header with OAuth data. Parse the header
291
- // and add those overriding any duplicates from GET or POST
292
- if (@substr($request_headers['Authorization'], 0, 6) == "OAuth ") {
293
- $header_parameters = OAuthUtil::split_header(
294
- $request_headers['Authorization']
295
- );
296
- $parameters = array_merge($parameters, $header_parameters);
297
- }
298
-
299
- }
300
-
301
- return new OAuthRequest($http_method, $http_url, $parameters);
302
- }
303
-
304
- /**
305
- * pretty much a helper function to set up the request
306
- */
307
- public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) {
308
- @$parameters or $parameters = array();
309
- $defaults = array("oauth_version" => OAuthRequest::$version,
310
- "oauth_nonce" => OAuthRequest::generate_nonce(),
311
- "oauth_timestamp" => OAuthRequest::generate_timestamp(),
312
- "oauth_consumer_key" => $consumer->key);
313
- if ($token)
314
- $defaults['oauth_token'] = $token->key;
315
-
316
- $parameters = array_merge($defaults, $parameters);
317
-
318
- return new OAuthRequest($http_method, $http_url, $parameters);
319
- }
320
-
321
- public function set_parameter($name, $value, $allow_duplicates = true) {
322
- if ($allow_duplicates && isset($this->parameters[$name])) {
323
- // We have already added parameter(s) with this name, so add to the list
324
- if (is_scalar($this->parameters[$name])) {
325
- // This is the first duplicate, so transform scalar (string)
326
- // into an array so we can add the duplicates
327
- $this->parameters[$name] = array($this->parameters[$name]);
328
- }
329
-
330
- $this->parameters[$name][] = $value;
331
- } else {
332
- $this->parameters[$name] = $value;
333
- }
334
- }
335
-
336
- public function get_parameter($name) {
337
- return isset($this->parameters[$name]) ? $this->parameters[$name] : null;
338
- }
339
-
340
- public function get_parameters() {
341
- return $this->parameters;
342
- }
343
-
344
- public function unset_parameter($name) {
345
- unset($this->parameters[$name]);
346
- }
347
-
348
- /**
349
- * The request parameters, sorted and concatenated into a normalized string.
350
- * @return string
351
- */
352
- public function get_signable_parameters() {
353
- // Grab all parameters
354
- $params = $this->parameters;
355
-
356
- // Remove oauth_signature if present
357
- // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")
358
- if (isset($params['oauth_signature'])) {
359
- unset($params['oauth_signature']);
360
- }
361
-
362
- return OAuthUtil::build_http_query($params);
363
- }
364
-
365
- /**
366
- * Returns the base string of this request
367
- *
368
- * The base string defined as the method, the url
369
- * and the parameters (normalized), each urlencoded
370
- * and the concated with &.
371
- */
372
- public function get_signature_base_string() {
373
- $parts = array(
374
- $this->get_normalized_http_method(),
375
- $this->get_normalized_http_url(),
376
- $this->get_signable_parameters()
377
- );
378
-
379
- $parts = OAuthUtil::urlencode_rfc3986($parts);
380
-
381
- return implode('&', $parts);
382
- }
383
-
384
- /**
385
- * just uppercases the http method
386
- */
387
- public function get_normalized_http_method() {
388
- return strtoupper($this->http_method);
389
- }
390
-
391
- /**
392
- * parses the url and rebuilds it to be
393
- * scheme://host/path
394
- */
395
- public function get_normalized_http_url() {
396
- $parts = parse_url($this->http_url);
397
-
398
- $port = @$parts['port'];
399
- $scheme = $parts['scheme'];
400
- $host = $parts['host'];
401
- $path = @$parts['path'];
402
-
403
- $port or $port = ($scheme == 'https') ? '443' : '80';
404
-
405
- if (($scheme == 'https' && $port != '443')
406
- || ($scheme == 'http' && $port != '80')) {
407
- $host = "$host:$port";
408
- }
409
- return "$scheme://$host$path";
410
- }
411
-
412
- /**
413
- * builds a url usable for a GET request
414
- */
415
- public function to_url() {
416
- $post_data = $this->to_postdata();
417
- $out = $this->get_normalized_http_url();
418
- if ($post_data) {
419
- $out .= '?'.$post_data;
420
- }
421
- return $out;
422
- }
423
-
424
- /**
425
- * builds the data one would send in a POST request
426
- */
427
- public function to_postdata() {
428
- return OAuthUtil::build_http_query($this->parameters);
429
- }
430
-
431
- /**
432
- * builds the Authorization: header
433
- */
434
- public function to_header($realm=null) {
435
- $first = true;
436
- if($realm) {
437
- $out = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986($realm) . '"';
438
- $first = false;
439
- } else
440
- $out = 'Authorization: OAuth';
441
-
442
- $total = array();
443
- foreach ($this->parameters as $k => $v) {
444
- if (substr($k, 0, 5) != "oauth") continue;
445
- if (is_array($v)) {
446
- throw new OAuthException('Arrays not supported in headers');
447
- }
448
- $out .= ($first) ? ' ' : ',';
449
- $out .= OAuthUtil::urlencode_rfc3986($k) .
450
- '="' .
451
- OAuthUtil::urlencode_rfc3986($v) .
452
- '"';
453
- $first = false;
454
- }
455
- return $out;
456
- }
457
-
458
- public function __toString() {
459
- return $this->to_url();
460
- }
461
-
462
-
463
- public function sign_request($signature_method, $consumer, $token) {
464
- $this->set_parameter(
465
- "oauth_signature_method",
466
- $signature_method->get_name(),
467
- false
468
- );
469
- $signature = $this->build_signature($signature_method, $consumer, $token);
470
- $this->set_parameter("oauth_signature", $signature, false);
471
- }
472
-
473
- public function build_signature($signature_method, $consumer, $token) {
474
- $signature = $signature_method->build_signature($this, $consumer, $token);
475
- return $signature;
476
- }
477
-
478
- /**
479
- * util function: current timestamp
480
- */
481
- private static function generate_timestamp() {
482
- return time();
483
- }
484
-
485
- /**
486
- * util function: current nonce
487
- */
488
- private static function generate_nonce() {
489
- $mt = microtime();
490
- $rand = mt_rand();
491
-
492
- return md5($mt . $rand); // md5s look nicer than numbers
493
- }
494
- }
495
- }
496
-
497
- if (!class_exists('OAuthServer')) {
498
- class OAuthServer {
499
- protected $timestamp_threshold = 300; // in seconds, five minutes
500
- protected $version = '1.0'; // hi blaine
501
- protected $signature_methods = array();
502
-
503
- protected $data_store;
504
-
505
- function __construct($data_store) {
506
- $this->data_store = $data_store;
507
- }
508
-
509
- public function add_signature_method($signature_method) {
510
- $this->signature_methods[$signature_method->get_name()] =
511
- $signature_method;
512
- }
513
-
514
- // high level functions
515
-
516
- /**
517
- * process a request_token request
518
- * returns the request token on success
519
- */
520
- public function fetch_request_token(&$request) {
521
- $this->get_version($request);
522
-
523
- $consumer = $this->get_consumer($request);
524
-
525
- // no token required for the initial token request
526
- $token = NULL;
527
-
528
- $this->check_signature($request, $consumer, $token);
529
-
530
- // Rev A change
531
- $callback = $request->get_parameter('oauth_callback');
532
- $new_token = $this->data_store->new_request_token($consumer, $callback);
533
-
534
- return $new_token;
535
- }
536
-
537
- /**
538
- * process an access_token request
539
- * returns the access token on success
540
- */
541
- public function fetch_access_token(&$request) {
542
- $this->get_version($request);
543
-
544
- $consumer = $this->get_consumer($request);
545
-
546
- // requires authorized request token
547
- $token = $this->get_token($request, $consumer, "request");
548
-
549
- $this->check_signature($request, $consumer, $token);
550
-
551
- // Rev A change
552
- $verifier = $request->get_parameter('oauth_verifier');
553
- $new_token = $this->data_store->new_access_token($token, $consumer, $verifier);
554
-
555
- return $new_token;
556
- }
557
-
558
- /**
559
- * verify an api call, checks all the parameters
560
- */
561
- public function verify_request(&$request) {
562
- $this->get_version($request);
563
- $consumer = $this->get_consumer($request);
564
- $token = $this->get_token($request, $consumer, "access");
565
- $this->check_signature($request, $consumer, $token);
566
- return array($consumer, $token);
567
- }
568
-
569
- // Internals from here
570
- /**
571
- * version 1
572
- */
573
- private function get_version(&$request) {
574
- $version = $request->get_parameter("oauth_version");
575
- if (!$version) {
576
- // Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present.
577
- // Chapter 7.0 ("Accessing Protected Ressources")
578
- $version = '1.0';
579
- }
580
- if ($version !== $this->version) {
581
- throw new OAuthException("OAuth version '$version' not supported");
582
- }
583
- return $version;
584
- }
585
-
586
- /**
587
- * figure out the signature with some defaults
588
- */
589
- private function get_signature_method(&$request) {
590
- $signature_method =
591
- @$request->get_parameter("oauth_signature_method");
592
-
593
- if (!$signature_method) {
594
- // According to chapter 7 ("Accessing Protected Ressources") the signature-method
595
- // parameter is required, and we can't just fallback to PLAINTEXT
596
- throw new OAuthException('No signature method parameter. This parameter is required');
597
- }
598
-
599
- if (!in_array($signature_method,
600
- array_keys($this->signature_methods))) {
601
- throw new OAuthException(
602
- "Signature method '$signature_method' not supported " .
603
- "try one of the following: " .
604
- implode(", ", array_keys($this->signature_methods))
605
- );
606
- }
607
- return $this->signature_methods[$signature_method];
608
- }
609
-
610
- /**
611
- * try to find the consumer for the provided request's consumer key
612
- */
613
- private function get_consumer(&$request) {
614
- $consumer_key = @$request->get_parameter("oauth_consumer_key");
615
- if (!$consumer_key) {
616
- throw new OAuthException("Invalid consumer key");
617
- }
618
-
619
- $consumer = $this->data_store->lookup_consumer($consumer_key);
620
- if (!$consumer) {
621
- throw new OAuthException("Invalid consumer");
622
- }
623
-
624
- return $consumer;
625
- }
626
-
627
- /**
628
- * try to find the token for the provided request's token key
629
- */
630
- private function get_token(&$request, $consumer, $token_type="access") {
631
- $token_field = @$request->get_parameter('oauth_token');
632
- $token = $this->data_store->lookup_token(
633
- $consumer, $token_type, $token_field
634
- );
635
- if (!$token) {
636
- throw new OAuthException("Invalid $token_type token: $token_field");
637
- }
638
- return $token;
639
- }
640
-
641
- /**
642
- * all-in-one function to check the signature on a request
643
- * should guess the signature method appropriately
644
- */
645
- private function check_signature(&$request, $consumer, $token) {
646
- // this should probably be in a different method
647
- $timestamp = @$request->get_parameter('oauth_timestamp');
648
- $nonce = @$request->get_parameter('oauth_nonce');
649
-
650
- $this->check_timestamp($timestamp);
651
- $this->check_nonce($consumer, $token, $nonce, $timestamp);
652
-
653
- $signature_method = $this->get_signature_method($request);
654
-
655
- $signature = $request->get_parameter('oauth_signature');
656
- $valid_sig = $signature_method->check_signature(
657
- $request,
658
- $consumer,
659
- $token,
660
- $signature
661
- );
662
-
663
- if (!$valid_sig) {
664
- throw new OAuthException("Invalid signature");
665
- }
666
- }
667
-
668
- /**
669
- * check that the timestamp is new enough
670
- */
671
- private function check_timestamp($timestamp) {
672
- if( ! $timestamp )
673
- throw new OAuthException(
674
- 'Missing timestamp parameter. The parameter is required'
675
- );
676
-
677
- // verify that timestamp is recentish
678
- $now = time();
679
- if (abs($now - $timestamp) > $this->timestamp_threshold) {
680
- throw new OAuthException(
681
- "Expired timestamp, yours $timestamp, ours $now"
682
- );
683
- }
684
- }
685
-
686
- /**
687
- * check that the nonce is not repeated
688
- */
689
- private function check_nonce($consumer, $token, $nonce, $timestamp) {
690
- if( ! $nonce )
691
- throw new OAuthException(
692
- 'Missing nonce parameter. The parameter is required'
693
- );
694
-
695
- // verify that the nonce is uniqueish
696
- $found = $this->data_store->lookup_nonce(
697
- $consumer,
698
- $token,
699
- $nonce,
700
- $timestamp
701
- );
702
- if ($found) {
703
- throw new OAuthException("Nonce already used: $nonce");
704
- }
705
- }
706
-
707
- }
708
- }
709
-
710
- if (!class_exists('OAuthDataStore')) {
711
- class OAuthDataStore {
712
- function lookup_consumer($consumer_key) {
713
- // implement me
714
- }
715
-
716
- function lookup_token($consumer, $token_type, $token) {
717
- // implement me
718
- }
719
-
720
- function lookup_nonce($consumer, $token, $nonce, $timestamp) {
721
- // implement me
722
- }
723
-
724
- function new_request_token($consumer, $callback = null) {
725
- // return a new token attached to this consumer
726
- }
727
-
728
- function new_access_token($token, $consumer, $verifier = null) {
729
- // return a new access token attached to this consumer
730
- // for the user associated with this token if the request token
731
- // is authorized
732
- // should also invalidate the request token
733
- }
734
-
735
- }
736
- }
737
-
738
- if (!class_exists('OAuthUtil')) {
739
- class OAuthUtil {
740
- public static function urlencode_rfc3986($input) {
741
- if (is_array($input)) {
742
- return array_map(array('OAuthUtil', 'urlencode_rfc3986'), $input);
743
- } else if (is_scalar($input)) {
744
- return str_replace(
745
- '+',
746
- ' ',
747
- str_replace('%7E', '~', rawurlencode($input))
748
- );
749
- } else {
750
- return '';
751
- }
752
- }
753
-
754
-
755
- // This decode function isn't taking into consideration the above
756
- // modifications to the encoding process. However, this method doesn't
757
- // seem to be used anywhere so leaving it as is.
758
- public static function urldecode_rfc3986($string) {
759
- return urldecode($string);
760
- }
761
-
762
- // Utility function for turning the Authorization: header into
763
- // parameters, has to do some unescaping
764
- // Can filter out any non-oauth parameters if needed (default behaviour)
765
- public static function split_header($header, $only_allow_oauth_parameters = true) {
766
- $pattern = '/(([-_a-z]*)=("([^"]*)"|([^,]*)),?)/';
767
- $offset = 0;
768
- $params = array();
769
- while (preg_match($pattern, $header, $matches, PREG_OFFSET_CAPTURE, $offset) > 0) {
770
- $match = $matches[0];
771
- $header_name = $matches[2][0];
772
- $header_content = (isset($matches[5])) ? $matches[5][0] : $matches[4][0];
773
- if (preg_match('/^oauth_/', $header_name) || !$only_allow_oauth_parameters) {
774
- $params[$header_name] = OAuthUtil::urldecode_rfc3986($header_content);
775
- }
776
- $offset = $match[1] + strlen($match[0]);
777
- }
778
-
779
- if (isset($params['realm'])) {
780
- unset($params['realm']);
781
- }
782
-
783
- return $params;
784
- }
785
-
786
- // helper to try to sort out headers for people who aren't running apache
787
- public static function get_headers() {
788
- if (function_exists('apache_request_headers')) {
789
- // we need this to get the actual Authorization: header
790
- // because apache tends to tell us it doesn't exist
791
- $headers = apache_request_headers();
792
-
793
- // sanitize the output of apache_request_headers because
794
- // we always want the keys to be Cased-Like-This and arh()
795
- // returns the headers in the same case as they are in the
796
- // request
797
- $out = array();
798
- foreach( $headers AS $key => $value ) {
799
- $key = str_replace(
800
- " ",
801
- "-",
802
- ucwords(strtolower(str_replace("-", " ", $key)))
803
- );
804
- $out[$key] = $value;
805
- }
806
- } else {
807
- // otherwise we don't have apache and are just going to have to hope
808
- // that $_SERVER actually contains what we need
809
- $out = array();
810
- if( isset($_SERVER['CONTENT_TYPE']) )
811
- $out['Content-Type'] = $_SERVER['CONTENT_TYPE'];
812
- if( isset($_ENV['CONTENT_TYPE']) )
813
- $out['Content-Type'] = $_ENV['CONTENT_TYPE'];
814
-
815
- foreach ($_SERVER as $key => $value) {
816
- if (substr($key, 0, 5) == "HTTP_") {
817
- // this is chaos, basically it is just there to capitalize the first
818
- // letter of every word that is not an initial HTTP and strip HTTP
819
- // code from przemek
820
- $key = str_replace(
821
- " ",
822
- "-",
823
- ucwords(strtolower(str_replace("_", " ", substr($key, 5))))
824
- );
825
- $out[$key] = $value;
826
- }
827
- }
828
- }
829
- return $out;
830
- }
831
-
832
- // This function takes a input like a=b&a=c&d=e and returns the parsed
833
- // parameters like this
834
- // array('a' => array('b','c'), 'd' => 'e')
835
- public static function parse_parameters( $input ) {
836
- if (!isset($input) || !$input) return array();
837
-
838
- $pairs = explode('&', $input);
839
-
840
- $parsed_parameters = array();
841
- foreach ($pairs as $pair) {
842
- $split = explode('=', $pair, 2);
843
- $parameter = OAuthUtil::urldecode_rfc3986($split[0]);
844
- $value = isset($split[1]) ? OAuthUtil::urldecode_rfc3986($split[1]) : '';
845
-
846
- if (isset($parsed_parameters[$parameter])) {
847
- // We have already recieved parameter(s) with this name, so add to the list
848
- // of parameters with this name
849
-
850
- if (is_scalar($parsed_parameters[$parameter])) {
851
- // This is the first duplicate, so transform scalar (string) into an array
852
- // so we can add the duplicates
853
- $parsed_parameters[$parameter] = array($parsed_parameters[$parameter]);
854
- }
855
-
856
- $parsed_parameters[$parameter][] = $value;
857
- } else {
858
- $parsed_parameters[$parameter] = $value;
859
- }
860
- }
861
- return $parsed_parameters;
862
- }
863
-
864
- public static function build_http_query($params) {
865
- if (!$params) return '';
866
-
867
- // Urlencode both keys and values
868
- $keys = OAuthUtil::urlencode_rfc3986(array_keys($params));
869
- $values = OAuthUtil::urlencode_rfc3986(array_values($params));
870
- $params = array_combine($keys, $values);
871
-
872
- // Parameters are sorted by name, using lexicographical byte value ordering.
873
- // Ref: Spec: 9.1.1 (1)
874
- uksort($params, 'strcmp');
875
-
876
- $pairs = array();
877
- foreach ($params as $parameter => $value) {
878
- if (is_array($value)) {
879
- // If two or more parameters share the same name, they are sorted by their value
880
- // Ref: Spec: 9.1.1 (1)
881
- natsort($value);
882
- foreach ($value as $duplicate_value) {
883
- $pairs[] = $parameter . '=' . $duplicate_value;
884
- }
885
- } else {
886
- $pairs[] = $parameter . '=' . $value;
887
- }
888
- }
889
- // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)
890
- // Each name-value pair is separated by an '&' character (ASCII code 38)
891
- return implode('&', $pairs);
892
- }
893
- }
894
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
library/oauth_client.php DELETED
@@ -1,2758 +0,0 @@
1
- <?php
2
- /*
3
- * oauth_client.php
4
- *
5
- * @(#) $Id: oauth_client.php,v 1.124 2014/12/05 05:09:11 mlemos Exp $
6
- *
7
- */
8
-
9
- /*
10
- {metadocument}<?xml version="1.0" encoding="ISO-8859-1" ?>
11
- <class>
12
-
13
- <package>net.manuellemos.oauth</package>
14
-
15
- <version>@(#) $Id: oauth_client.php,v 1.124 2014/12/05 05:09:11 mlemos Exp $</version>
16
- <copyright>Copyright � (C) Manuel Lemos 2012</copyright>
17
- <title>OAuth client</title>
18
- <author>Manuel Lemos</author>
19
- <authoraddress>mlemos-at-acm.org</authoraddress>
20
-
21
- <documentation>
22
- <idiom>en</idiom>
23
- <purpose>This class serves two main purposes:<paragraphbreak />
24
- 1) Implement the OAuth protocol to retrieve a token from a server to
25
- authorize the access to an API on behalf of the current
26
- user.<paragraphbreak />
27
- 2) Perform calls to a Web services API using a token previously
28
- obtained using this class or a token provided some other way by the
29
- Web services provider.</purpose>
30
- <usage>Regardless of your purposes, you always need to start calling
31
- the class <functionlink>Initialize</functionlink> function after
32
- initializing setup variables. After you are done with the class,
33
- always call the <functionlink>Finalize</functionlink> function at
34
- the end.<paragraphbreak />
35
- This class supports either OAuth protocol versions 1.0, 1.0a and
36
- 2.0. It abstracts the differences between these protocol versions,
37
- so the class usage is the same independently of the OAuth
38
- version of the server.<paragraphbreak />
39
- The class also provides built-in support to several popular OAuth
40
- servers, so you do not have to manually configure all the details to
41
- access those servers. Just set the
42
- <variablelink>server</variablelink> variable to configure the class
43
- to access one of the built-in supported servers.<paragraphbreak />
44
- If you need to access one type of server that is not yet directly
45
- supported by the class, you need to configure it explicitly setting
46
- the variables: <variablelink>oauth_version</variablelink>,
47
- <variablelink>url_parameters</variablelink>,
48
- <variablelink>authorization_header</variablelink>,
49
- <variablelink>request_token_url</variablelink>,
50
- <variablelink>dialog_url</variablelink>,
51
- <variablelink>pin_dialog_url</variablelink>,
52
- <variablelink>offline_dialog_url</variablelink>,
53
- <variablelink>append_state_to_redirect_uri</variablelink> and
54
- <variablelink>access_token_url</variablelink>.<paragraphbreak />
55
- Before proceeding to the actual OAuth authorization process, you
56
- need to have registered your application with the OAuth server. The
57
- registration provides you values to set the variables
58
- <variablelink>client_id</variablelink> and
59
- <variablelink>client_secret</variablelink>. Some servers also
60
- provide an additional value to set the
61
- <variablelink>api_key</variablelink> variable.<paragraphbreak />
62
- You also need to set the variables
63
- <variablelink>redirect_uri</variablelink> and
64
- <variablelink>scope</variablelink> before calling the
65
- <functionlink>Process</functionlink> function to make the class
66
- perform the necessary interactions with the OAuth
67
- server.<paragraphbreak />
68
- The OAuth protocol involves multiple steps that include redirection
69
- to the OAuth server. There it asks permission to the current user to
70
- grant your application access to APIs on his/her behalf. When there
71
- is a redirection, the class will set the
72
- <variablelink>exit</variablelink> variable to
73
- <booleanvalue>1</booleanvalue>. Then your script should exit
74
- immediately without outputting anything.<paragraphbreak />
75
- When the OAuth access token is successfully obtained, the following
76
- variables are set by the class with the obtained values:
77
- <variablelink>access_token</variablelink>,
78
- <variablelink>access_token_secret</variablelink>,
79
- <variablelink>access_token_expiry</variablelink>,
80
- <variablelink>access_token_type</variablelink>. You may want to
81
- store these values to use them later when calling the server
82
- APIs.<paragraphbreak />
83
- If there was a problem during OAuth authorization process, check the
84
- variable <variablelink>authorization_error</variablelink> to
85
- determine the reason.<paragraphbreak />
86
- Once you get the access token, you can call the server APIs using
87
- the <functionlink>CallAPI</functionlink> function. Check the
88
- <variablelink>access_token_error</variablelink> variable to
89
- determine if there was an error when trying to to call the
90
- API.<paragraphbreak />
91
- If for some reason the user has revoked the access to your
92
- application, you need to ask the user to authorize your application
93
- again. First you may need to call the function
94
- <functionlink>ResetAccessToken</functionlink> to reset the value of
95
- the access token that may be cached in session variables.</usage>
96
- </documentation>
97
-
98
- {/metadocument}
99
- */
100
- if(!class_exists('oauth_client_class')){
101
- class oauth_client_class
102
- {
103
- /*
104
- {metadocument}
105
- <variable>
106
- <name>error</name>
107
- <type>STRING</type>
108
- <value></value>
109
- <documentation>
110
- <purpose>Store the message that is returned when an error
111
- occurs.</purpose>
112
- <usage>Check this variable to understand what happened when a call to
113
- any of the class functions has failed.<paragraphbreak />
114
- This class uses cumulative error handling. This means that if one
115
- class functions that may fail is called and this variable was
116
- already set to an error message due to a failure in a previous call
117
- to the same or other function, the function will also fail and does
118
- not do anything.<paragraphbreak />
119
- This allows programs using this class to safely call several
120
- functions that may fail and only check the failure condition after
121
- the last function call.<paragraphbreak />
122
- Just set this variable to an empty string to clear the error
123
- condition.</usage>
124
- </documentation>
125
- </variable>
126
- {/metadocument}
127
- */
128
- var $error = '';
129
-
130
- /*
131
- {metadocument}
132
- <variable>
133
- <name>debug</name>
134
- <type>BOOLEAN</type>
135
- <value>0</value>
136
- <documentation>
137
- <purpose>Control whether debug output is enabled</purpose>
138
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if you
139
- need to check what is going on during calls to the class. When
140
- enabled, the debug output goes either to the variable
141
- <variablelink>debug_output</variablelink> and the PHP error log.</usage>
142
- </documentation>
143
- </variable>
144
- {/metadocument}
145
- */
146
- var $debug = false;
147
-
148
- /*
149
- {metadocument}
150
- <variable>
151
- <name>debug_http</name>
152
- <type>BOOLEAN</type>
153
- <value>0</value>
154
- <documentation>
155
- <purpose>Control whether the dialog with the remote Web server
156
- should also be logged.</purpose>
157
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if you
158
- want to inspect the data exchange with the OAuth server.</usage>
159
- </documentation>
160
- </variable>
161
- {/metadocument}
162
- */
163
- var $debug_http = false;
164
-
165
- /*
166
- {metadocument}
167
- <variable>
168
- <name>exit</name>
169
- <type>BOOLEAN</type>
170
- <value>0</value>
171
- <documentation>
172
- <purpose>Determine if the current script should be exited.</purpose>
173
- <usage>Check this variable after calling the
174
- <functionlink>Process</functionlink> function and exit your script
175
- immediately if the variable is set to
176
- <booleanvalue>1</booleanvalue>.</usage>
177
- </documentation>
178
- </variable>
179
- {/metadocument}
180
- */
181
- var $exit = false;
182
-
183
- /*
184
- {metadocument}
185
- <variable>
186
- <name>debug_output</name>
187
- <type>STRING</type>
188
- <value></value>
189
- <documentation>
190
- <purpose>Capture the debug output generated by the class</purpose>
191
- <usage>Inspect this variable if you need to see what happened during
192
- the class function calls.</usage>
193
- </documentation>
194
- </variable>
195
- {/metadocument}
196
- */
197
- var $debug_output = '';
198
-
199
- /*
200
- {metadocument}
201
- <variable>
202
- <name>debug_prefix</name>
203
- <type>STRING</type>
204
- <value>OAuth client: </value>
205
- <documentation>
206
- <purpose>Mark the lines of the debug output to identify actions
207
- performed by this class.</purpose>
208
- <usage>Change this variable if you prefer the debug output lines to
209
- be prefixed with a different text.</usage>
210
- </documentation>
211
- </variable>
212
- {/metadocument}
213
- */
214
- var $debug_prefix = 'OAuth client: ';
215
-
216
- /*
217
- {metadocument}
218
- <variable>
219
- <name>server</name>
220
- <type>STRING</type>
221
- <value></value>
222
- <documentation>
223
- <purpose>Identify the type of OAuth server to access.</purpose>
224
- <usage>The class provides built-in support to several types of OAuth
225
- servers. This means that the class can automatically initialize
226
- several configuration variables just by setting this server
227
- variable.<paragraphbreak />
228
- Currently it supports the following servers:
229
- <stringvalue>37Signals</stringvalue>,
230
- <stringvalue>Amazon</stringvalue>,
231
- <stringvalue>Bitbucket</stringvalue>,
232
- <stringvalue>Bitly</stringvalue>,
233
- <stringvalue>Box</stringvalue>,
234
- <stringvalue>Buffer</stringvalue>,
235
- <stringvalue>Copy</stringvalue>,
236
- <stringvalue>Dailymotion</stringvalue>,
237
- <stringvalue>Discogs</stringvalue>,
238
- <stringvalue>Disqus</stringvalue>,
239
- <stringvalue>Dropbox</stringvalue> (Dropbox with OAuth 1.0),
240
- <stringvalue>Dropbox2</stringvalue> (Dropbox with OAuth 2.0),
241
- <stringvalue>Etsy</stringvalue>,
242
- <stringvalue>Eventful</stringvalue>,
243
- <stringvalue>Facebook</stringvalue>,
244
- <stringvalue>Fitbit</stringvalue>,
245
- <stringvalue>Flickr</stringvalue>,
246
- <stringvalue>Foursquare</stringvalue>,
247
- <stringvalue>github</stringvalue>,
248
- <stringvalue>Google</stringvalue>,
249
- <stringvalue>Google1</stringvalue> (Google with OAuth 1.0),
250
- <stringvalue>imgur</stringvalue>,
251
- <stringvalue>Intuit</stringvalue>,
252
- <stringvalue>Instagram</stringvalue>,
253
- <stringvalue>Jawbone</stringvalue>,
254
- <stringvalue>LinkedIn</stringvalue>,
255
- <stringvalue>LinkedIn2</stringvalue> (LinkedIn with OAuth 2.0),
256
- <stringvalue>mail.ru</stringvalue>,
257
- <stringvalue>MailChimp</stringvalue>,
258
- <stringvalue>Mavenlink</stringvalue>,
259
- <stringvalue>Microsoft</stringvalue>,
260
- <stringvalue>oDesk</stringvalue>,
261
- <stringvalue>Paypal</stringvalue>,
262
- <stringvalue>PaypalApplication</stringvalue>,
263
- <stringvalue>Rdio</stringvalue>,
264
- <stringvalue>Reddit</stringvalue>,
265
- <stringvalue>RunKeeper</stringvalue>,
266
- <stringvalue>Salesforce</stringvalue>,
267
- <stringvalue>Scoop.it</stringvalue>,
268
- <stringvalue>StockTwits</stringvalue>,
269
- <stringvalue>SurveyMonkey</stringvalue>,
270
- <stringvalue>TeamViewer</stringvalue>,
271
- <stringvalue>Tumblr</stringvalue>,
272
- <stringvalue>Twitter</stringvalue>,
273
- <stringvalue>Vimeo</stringvalue>,
274
- <stringvalue>VK</stringvalue>,
275
- <stringvalue>Withings</stringvalue>,
276
- <stringvalue>Wordpress</stringvalue>,
277
- <stringvalue>Xero</stringvalue>,
278
- <stringvalue>XING</stringvalue>,
279
- <stringvalue>Yahoo</stringvalue> and
280
- <stringvalue>Yandex</stringvalue>. Please contact the author if you
281
- would like to ask to add built-in support for other types of OAuth
282
- servers.<paragraphbreak />
283
- If you want to access other types of OAuth servers that are not
284
- yet supported, set this variable to an empty string and configure
285
- other variables with values specific to those servers.</usage>
286
- </documentation>
287
- </variable>
288
- {/metadocument}
289
- */
290
- var $server = '';
291
-
292
- /*
293
- {metadocument}
294
- <variable>
295
- <name>configuration_file</name>
296
- <type>STRING</type>
297
- <value>oauth_configuration.json</value>
298
- <documentation>
299
- <purpose>Specify the path of the configuration file that defines the
300
- properties of additional OAuth server types.</purpose>
301
- <usage>Change the path in this variable if you are accessing a type
302
- of server without support built-in the class and you need to put
303
- the configuration file path in a different directory.</usage>
304
- </documentation>
305
- </variable>
306
- {/metadocument}
307
- */
308
- //var $configuration_file = './oauth_configuration.json';
309
-
310
- /*
311
- {metadocument}
312
- <variable>
313
- <name>request_token_url</name>
314
- <type>STRING</type>
315
- <value></value>
316
- <documentation>
317
- <purpose>URL of the OAuth server to request the initial token for
318
- OAuth 1.0 and 1.0a servers.</purpose>
319
- <usage>Set this variable to the OAuth request token URL when you are
320
- not accessing one of the built-in supported OAuth
321
- servers.<paragraphbreak />
322
- For OAuth 1.0 and 1.0a servers, the request token URL can have
323
- certain marks that will act as template placeholders which will be
324
- replaced with given values before requesting the authorization
325
- token. Currently it supports the following placeholder
326
- marks:<paragraphbreak />
327
- {SCOPE} - scope of the requested permissions to the granted by the
328
- OAuth server with the user permissions</usage>
329
- </documentation>
330
- </variable>
331
- {/metadocument}
332
- */
333
- var $request_token_url = '';
334
-
335
- /*
336
- {metadocument}
337
- <variable>
338
- <name>dialog_url</name>
339
- <type>STRING</type>
340
- <value></value>
341
- <documentation>
342
- <purpose>URL of the OAuth server to redirect the browser so the user
343
- can grant access to your application.</purpose>
344
- <usage>Set this variable to the OAuth request token URL when you are
345
- not accessing one of the built-in supported OAuth servers.<paragraphbreak />
346
- For OAuth 1.0a servers that return the login dialog URL
347
- automatically, set this variable to
348
- <stringvalue>automatic</stringvalue><paragraphbreak />
349
- For certain servers, the dialog URL can have certain marks that
350
- will act as template placeholders which will be replaced with
351
- values defined before redirecting the users browser. Currently it
352
- supports the following placeholder marks:<paragraphbreak />
353
- {REDIRECT_URI} - URL to redirect when returning from the OAuth
354
- server authorization page<paragraphbreak />
355
- {CLIENT_ID} - client application identifier registered at the
356
- server<paragraphbreak />
357
- {SCOPE} - scope of the requested permissions to the granted by the
358
- OAuth server with the user permissions<paragraphbreak />
359
- {STATE} - identifier of the OAuth session state<paragraphbreak />
360
- {API_KEY} - API key to access the server</usage>
361
- </documentation>
362
- </variable>
363
- {/metadocument}
364
- */
365
- var $dialog_url = '';
366
-
367
- /*
368
- {metadocument}
369
- <variable>
370
- <name>pin_dialog_url</name>
371
- <type>STRING</type>
372
- <value></value>
373
- <documentation>
374
- <purpose>URL of the OAuth server to redirect the browser so the user
375
- can grant access to your application.</purpose>
376
- <usage>Set this variable when using the pin based authorization and
377
- the format of the of the authorization dialog page URL is
378
- different than the one set to the
379
- <variablelink>dialog_url</variablelink> variable.</usage>
380
- </documentation>
381
- </variable>
382
- {/metadocument}
383
- */
384
- var $pin_dialog_url = '';
385
-
386
- /*
387
- {metadocument}
388
- <variable>
389
- <name>offline_dialog_url</name>
390
- <type>STRING</type>
391
- <value></value>
392
- <documentation>
393
- <purpose>URL of the OAuth server to redirect the browser so the user
394
- can grant access to your application when offline access is
395
- requested.</purpose>
396
- <usage>Set this variable to the OAuth request token URL when you are
397
- not accessing one of the built-in supported OAuth servers and the
398
- OAuth server supports offline access.<paragraphbreak />
399
- It should have the same format as the
400
- <variablelink>dialog_url</variablelink> variable.</usage>
401
- </documentation>
402
- </variable>
403
- {/metadocument}
404
- */
405
- var $offline_dialog_url = '';
406
-
407
- /*
408
- {metadocument}
409
- <variable>
410
- <name>pin</name>
411
- <type>STRING</type>
412
- <value></value>
413
- <documentation>
414
- <purpose>Value of the pin code for pin based authorization.</purpose>
415
- <usage>Set this value to the pin informed by the user when
416
- implementing the pin based authorization.<paragraphbreak />
417
- Make sure the <variablelink>redirect_uri</variablelink> variable
418
- is set to <stringvalue>oob</stringvalue>.</usage>
419
- </documentation>
420
- </variable>
421
- {/metadocument}
422
- */
423
- var $pin = '';
424
-
425
- /*
426
- {metadocument}
427
- <variable>
428
- <name>append_state_to_redirect_uri</name>
429
- <type>STRING</type>
430
- <value></value>
431
- <documentation>
432
- <purpose>Pass the OAuth session state in a variable with a different
433
- name to work around implementation bugs of certain OAuth
434
- servers</purpose>
435
- <usage>Set this variable when you are not accessing one of the
436
- built-in supported OAuth servers if the OAuth server has a bug
437
- that makes it not pass back the OAuth state identifier in a
438
- request variable named state.</usage>
439
- </documentation>
440
- </variable>
441
- {/metadocument}
442
- */
443
- var $append_state_to_redirect_uri = '';
444
-
445
- /*
446
- {metadocument}
447
- <variable>
448
- <name>access_token_url</name>
449
- <type>STRING</type>
450
- <value></value>
451
- <documentation>
452
- <purpose>OAuth server URL that will return the access token
453
- URL.</purpose>
454
- <usage>Set this variable to the OAuth access token URL when you are
455
- not accessing one of the built-in supported OAuth servers.</usage>
456
- </documentation>
457
- </variable>
458
- {/metadocument}
459
- */
460
- var $access_token_url = '';
461
-
462
-
463
- /*
464
- {metadocument}
465
- <variable>
466
- <name>oauth_version</name>
467
- <type>STRING</type>
468
- <value>2.0</value>
469
- <documentation>
470
- <purpose>Version of the protocol version supported by the OAuth
471
- server.</purpose>
472
- <usage>Set this variable to the OAuth server protocol version when
473
- you are not accessing one of the built-in supported OAuth
474
- servers.</usage>
475
- </documentation>
476
- </variable>
477
- {/metadocument}
478
- */
479
- var $oauth_version = '2.0';
480
-
481
- /*
482
- {metadocument}
483
- <variable>
484
- <name>url_parameters</name>
485
- <type>BOOLEAN</type>
486
- <value>0</value>
487
- <documentation>
488
- <purpose>Determine if the API call parameters should be moved to the
489
- call URL.</purpose>
490
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if the
491
- API you need to call requires that the call parameters always be
492
- passed via the API URL.</usage>
493
- </documentation>
494
- </variable>
495
- {/metadocument}
496
- */
497
- var $url_parameters = false;
498
-
499
- /*
500
- {metadocument}
501
- <variable>
502
- <name>authorization_header</name>
503
- <type>BOOLEAN</type>
504
- <value>1</value>
505
- <documentation>
506
- <purpose>Determine if the OAuth parameters should be passed via HTTP
507
- Authorization request header.</purpose>
508
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if the
509
- OAuth server requires that the OAuth parameters be passed using
510
- the HTTP Authorization instead of the request URI parameters.</usage>
511
- </documentation>
512
- </variable>
513
- {/metadocument}
514
- */
515
- var $authorization_header = true;
516
-
517
- /*
518
- {metadocument}
519
- <variable>
520
- <name>token_request_method</name>
521
- <type>STRING</type>
522
- <value>GET</value>
523
- <documentation>
524
- <purpose>Define the HTTP method that should be used to request
525
- tokens from the server.</purpose>
526
- <usage>Set this variable to <stringvalue>POST</stringvalue> if the
527
- OAuth server does not support requesting tokens using the HTTP GET
528
- method.</usage>
529
- </documentation>
530
- </variable>
531
- {/metadocument}
532
- */
533
- var $token_request_method = 'GET';
534
-
535
- /*
536
- {metadocument}
537
- <variable>
538
- <name>signature_method</name>
539
- <type>STRING</type>
540
- <value>HMAC-SHA1</value>
541
- <documentation>
542
- <purpose>Define the method to generate the signature for API request
543
- parameters values.</purpose>
544
- <usage>Currently it supports <stringvalue>PLAINTEXT</stringvalue>
545
- and <stringvalue>HMAC-SHA1</stringvalue>.</usage>
546
- </documentation>
547
- </variable>
548
- {/metadocument}
549
- */
550
- var $signature_method = 'HMAC-SHA1';
551
-
552
- /*
553
- {metadocument}
554
- <variable>
555
- <name>redirect_uri</name>
556
- <type>STRING</type>
557
- <value></value>
558
- <documentation>
559
- <purpose>URL of the current script page that is calling this
560
- class</purpose>
561
- <usage>Set this variable to the current script page URL before
562
- proceeding the the OAuth authorization process.<paragraphbreak />
563
- For pin based authorization, set this variable to
564
- <stringvalue>oob</stringvalue>.</usage>
565
- </documentation>
566
- </variable>
567
- {/metadocument}
568
- */
569
- var $redirect_uri = '';
570
-
571
- /*
572
- {metadocument}
573
- <variable>
574
- <name>client_id</name>
575
- <type>STRING</type>
576
- <value></value>
577
- <documentation>
578
- <purpose>Identifier of your application registered with the OAuth
579
- server</purpose>
580
- <usage>Set this variable to the application identifier that is
581
- provided by the OAuth server when you register the
582
- application.</usage>
583
- </documentation>
584
- </variable>
585
- {/metadocument}
586
- */
587
- var $client_id = '';
588
-
589
- /*
590
- {metadocument}
591
- <variable>
592
- <name>client_secret</name>
593
- <type>STRING</type>
594
- <value></value>
595
- <documentation>
596
- <purpose>Secret value assigned to your application when it is
597
- registered with the OAuth server.</purpose>
598
- <usage>Set this variable to the application secret that is provided
599
- by the OAuth server when you register the application.</usage>
600
- </documentation>
601
- </variable>
602
- {/metadocument}
603
- */
604
- var $client_secret = '';
605
-
606
- /*
607
- {metadocument}
608
- <variable>
609
- <name>api_key</name>
610
- <type>STRING</type>
611
- <value></value>
612
- <documentation>
613
- <purpose>Identifier of your API key provided by the OAuth
614
- server</purpose>
615
- <usage>Set this variable to the API key if the OAuth server requires
616
- one.</usage>
617
- </documentation>
618
- </variable>
619
- {/metadocument}
620
- */
621
- var $api_key = '';
622
-
623
- /*
624
- {metadocument}
625
- <variable>
626
- <name>get_token_with_api_key</name>
627
- <type>BOOLEAN</type>
628
- <value>0</value>
629
- <documentation>
630
- <purpose>Option to determine if the access token should be retrieved
631
- using the API key value instead of the client secret.</purpose>
632
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if the
633
- OAuth server requires that the client secret be set to the API key
634
- when retrieving the OAuth token.</usage>
635
- </documentation>
636
- </variable>
637
- {/metadocument}
638
- */
639
- var $get_token_with_api_key = false;
640
-
641
- /*
642
- {metadocument}
643
- <variable>
644
- <name>scope</name>
645
- <type>STRING</type>
646
- <value></value>
647
- <documentation>
648
- <purpose>Permissions that your application needs to call the OAuth
649
- server APIs</purpose>
650
- <usage>Check the documentation of the APIs that your application
651
- needs to call to set this variable with the identifiers of the
652
- permissions that the user needs to grant to your application.</usage>
653
- </documentation>
654
- </variable>
655
- {/metadocument}
656
- */
657
- var $scope = '';
658
-
659
- /*
660
- {metadocument}
661
- <variable>
662
- <name>offline</name>
663
- <type>BOOLEAN</type>
664
- <value>0</value>
665
- <documentation>
666
- <purpose>Specify whether it will be necessary to call the API when
667
- the user is not present and the server supports renewing expired
668
- access tokens using refresh tokens.</purpose>
669
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if the
670
- server supports renewing expired tokens automatically when the
671
- user is not present.</usage>
672
- </documentation>
673
- </variable>
674
- {/metadocument}
675
- */
676
- var $offline = false;
677
-
678
- /*
679
- {metadocument}
680
- <variable>
681
- <name>access_token</name>
682
- <type>STRING</type>
683
- <value></value>
684
- <documentation>
685
- <purpose>Access token obtained from the OAuth server</purpose>
686
- <usage>Check this variable to get the obtained access token upon
687
- successful OAuth authorization.</usage>
688
- </documentation>
689
- </variable>
690
- {/metadocument}
691
- */
692
- var $access_token = '';
693
-
694
- /*
695
- {metadocument}
696
- <variable>
697
- <name>access_token_secret</name>
698
- <type>STRING</type>
699
- <value></value>
700
- <documentation>
701
- <purpose>Access token secret obtained from the OAuth server</purpose>
702
- <usage>If the OAuth protocol version is 1.0 or 1.0a, check this
703
- variable to get the obtained access token secret upon successful
704
- OAuth authorization.</usage>
705
- </documentation>
706
- </variable>
707
- {/metadocument}
708
- */
709
- var $access_token_secret = '';
710
-
711
- /*
712
- {metadocument}
713
- <variable>
714
- <name>access_token_expiry</name>
715
- <type>STRING</type>
716
- <value></value>
717
- <documentation>
718
- <purpose>Timestamp of the expiry of the access token obtained from
719
- the OAuth server.</purpose>
720
- <usage>Check this variable to get the obtained access token expiry
721
- time upon successful OAuth authorization. If this variable is
722
- empty, that means no expiry time was set.</usage>
723
- </documentation>
724
- </variable>
725
- {/metadocument}
726
- */
727
- var $access_token_expiry = '';
728
-
729
- /*
730
- {metadocument}
731
- <variable>
732
- <name>access_token_type</name>
733
- <type>STRING</type>
734
- <value></value>
735
- <documentation>
736
- <purpose>Type of access token obtained from the OAuth server.</purpose>
737
- <usage>Check this variable to get the obtained access token type
738
- upon successful OAuth authorization.</usage>
739
- </documentation>
740
- </variable>
741
- {/metadocument}
742
- */
743
- var $access_token_type = '';
744
-
745
- /*
746
- {metadocument}
747
- <variable>
748
- <name>default_access_token_type</name>
749
- <type>STRING</type>
750
- <value></value>
751
- <documentation>
752
- <purpose>Type of access token to be assumed when the OAuth server
753
- does not specify an access token type.</purpose>
754
- <usage>Set this variable if the server requires a certain type of
755
- access token to be used but it does not specify a token type
756
- when the access token is returned.</usage>
757
- </documentation>
758
- </variable>
759
- {/metadocument}
760
- */
761
- var $default_access_token_type = '';
762
-
763
-
764
- /*
765
- {metadocument}
766
- <variable>
767
- <name>access_token_parameter</name>
768
- <type>STRING</type>
769
- <value></value>
770
- <documentation>
771
- <purpose>Name of the access token parameter to be passed in API call
772
- requests.</purpose>
773
- <usage>Set this variable to a non-empty string to override the
774
- default name for the access token parameter which is
775
- <stringvalue>oauth_token</stringvalue> of OAuth 1 and
776
- <stringvalue>access_token</stringvalue> for OAuth 2.</usage>
777
- </documentation>
778
- </variable>
779
- {/metadocument}
780
- */
781
- var $access_token_parameter = '';
782
-
783
-
784
- /*
785
- {metadocument}
786
- <variable>
787
- <name>access_token_response</name>
788
- <type>ARRAY</type>
789
- <documentation>
790
- <purpose>The original response for the access token request</purpose>
791
- <usage>Check this variable if the OAuth server returns custom
792
- parameters in the request to obtain the access token.</usage>
793
- </documentation>
794
- </variable>
795
- {/metadocument}
796
- */
797
- var $access_token_response;
798
-
799
- /*
800
- {metadocument}
801
- <variable>
802
- <name>store_access_token_response</name>
803
- <type>BOOLEAN</type>
804
- <value>0</value>
805
- <documentation>
806
- <purpose>Option to determine if the original response for the access
807
- token request should be stored in the
808
- <variablelink>access_token_response</variablelink>
809
- variable.</purpose>
810
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if the
811
- OAuth server returns custom parameters in the request to obtain
812
- the access token that may be needed in subsequent API calls.</usage>
813
- </documentation>
814
- </variable>
815
- {/metadocument}
816
- */
817
- var $store_access_token_response = false;
818
-
819
- /*
820
- {metadocument}
821
- <variable>
822
- <name>access_token_authentication</name>
823
- <type>STRING</type>
824
- <value></value>
825
- <documentation>
826
- <purpose>Option to determine if the requests to obtain a new access
827
- token should use authentication to pass the application client ID
828
- and secret.</purpose>
829
- <usage>Set this variable to <stringvalue>basic</stringvalue> if the
830
- OAuth server requires that the the client ID and secret be passed
831
- using HTTP basic authentication headers when retrieving a new
832
- token.</usage>
833
- </documentation>
834
- </variable>
835
- {/metadocument}
836
- */
837
- var $access_token_authentication = '';
838
-
839
- /*
840
- {metadocument}
841
- <variable>
842
- <name>refresh_token</name>
843
- <type>STRING</type>
844
- <value></value>
845
- <documentation>
846
- <purpose>Refresh token obtained from the OAuth server</purpose>
847
- <usage>Check this variable to get the obtained refresh token upon
848
- successful OAuth authorization.</usage>
849
- </documentation>
850
- </variable>
851
- {/metadocument}
852
- */
853
- var $refresh_token = '';
854
-
855
- /*
856
- {metadocument}
857
- <variable>
858
- <name>access_token_error</name>
859
- <type>STRING</type>
860
- <value></value>
861
- <documentation>
862
- <purpose>Error message returned when a call to the API fails.</purpose>
863
- <usage>Check this variable to determine if there was an error while
864
- calling the Web services API when using the
865
- <functionlink>CallAPI</functionlink> function.</usage>
866
- </documentation>
867
- </variable>
868
- {/metadocument}
869
- */
870
- var $access_token_error = '';
871
-
872
- /*
873
- {metadocument}
874
- <variable>
875
- <name>authorization_error</name>
876
- <type>STRING</type>
877
- <value></value>
878
- <documentation>
879
- <purpose>Error message returned when it was not possible to obtain
880
- an OAuth access token</purpose>
881
- <usage>Check this variable to determine if there was an error while
882
- trying to obtain the OAuth access token.</usage>
883
- </documentation>
884
- </variable>
885
- {/metadocument}
886
- */
887
- var $authorization_error = '';
888
-
889
- /*
890
- {metadocument}
891
- <variable>
892
- <name>response_status</name>
893
- <type>INTEGER</type>
894
- <value>0</value>
895
- <documentation>
896
- <purpose>HTTP response status returned by the server when calling an
897
- API</purpose>
898
- <usage>Check this variable after calling the
899
- <functionlink>CallAPI</functionlink> function if the API calls and you
900
- need to process the error depending the response status.
901
- <integervalue>200</integervalue> means no error.
902
- <integervalue>0</integervalue> means the server response was not
903
- retrieved.</usage>
904
- </documentation>
905
- </variable>
906
- {/metadocument}
907
- */
908
- var $response_status = 0;
909
-
910
- /*
911
- {metadocument}
912
- <variable>
913
- <name>oauth_username</name>
914
- <type>STRING</type>
915
- <value></value>
916
- <documentation>
917
- <purpose>Define the user name to obtain authorization using a password.</purpose>
918
- <usage>Set this variable to the user name of the account to
919
- authorize instead of going through the interactive user
920
- authorization process.</usage>
921
- </documentation>
922
- </variable>
923
- {/metadocument}
924
- */
925
- var $oauth_username = '';
926
-
927
- /*
928
- {metadocument}
929
- <variable>
930
- <name>oauth_password</name>
931
- <type>STRING</type>
932
- <value></value>
933
- <documentation>
934
- <purpose>Define the user name to obtain authorization using a password.</purpose>
935
- <usage>Set this variable to the user password of the account to
936
- authorize instead of going through the interactive user
937
- authorization process.</usage>
938
- </documentation>
939
- </variable>
940
- {/metadocument}
941
- */
942
- var $oauth_password = '';
943
-
944
- /*
945
- {metadocument}
946
- <variable>
947
- <name>grant_type</name>
948
- <type>STRING</type>
949
- <value>authorization_code</value>
950
- <documentation>
951
- <purpose>Define the type of grant to obtain the OAuth 2 access
952
- token.</purpose>
953
- <usage>Change this variable to
954
- <stringvalue>client_credentials</stringvalue> to obtain
955
- application only access token.<paragraphbreak />
956
- Change this variable to <stringvalue>password</stringvalue> to
957
- obtain an access token on behalf of an user with a given username
958
- and password specified by the
959
- <variablelink>oauth_username</variablelink> and
960
- <variablelink>oauth_password</variablelink> variables
961
- respectively.<paragraphbreak />In this case the user does not need
962
- to be present, so the class will not redirect the user to the
963
- authorization dialog page.<paragraphbreak />
964
- </usage>
965
- </documentation>
966
- </variable>
967
- {/metadocument}
968
- */
969
- var $grant_type = "authorization_code";
970
-
971
- var $oauth_user_agent = 'PHP-OAuth-API (http://www.phpclasses.org/oauth-api $Revision: 1.124 $)';
972
-
973
- Function SetError($error)
974
- {
975
- $this->error = $error;
976
- if($this->debug)
977
- $this->OutputDebug('Error: '.$error);
978
- return(false);
979
- }
980
-
981
- Function SetPHPError($error)
982
- {
983
- return($this->SetError($error));
984
- }
985
-
986
- Function OutputDebug($message)
987
- {
988
- if($this->debug)
989
- {
990
- $message = $this->debug_prefix.$message;
991
- $this->debug_output .= $message."\n";;
992
- error_log($message);
993
- }
994
- return(true);
995
- }
996
-
997
- Function GetRequestTokenURL(&$request_token_url)
998
- {
999
- $request_token_url = $this->request_token_url;
1000
- return(true);
1001
- }
1002
-
1003
- Function GetDialogURL(&$url, $redirect_uri = '', $state = '')
1004
- {
1005
- $url = (($this->offline && strlen($this->offline_dialog_url)) ? $this->offline_dialog_url : (($redirect_uri === 'oob' && strlen($this->pin_dialog_url)) ? $this->pin_dialog_url : $this->dialog_url));
1006
- if(strlen($url) === 0)
1007
- return $this->SetError('the dialog URL '.($this->offline ? 'for offline access ' : '').'is not defined for this server');
1008
- $url = str_replace(
1009
- '{REDIRECT_URI}', UrlEncode($redirect_uri), str_replace(
1010
- '{STATE}', UrlEncode($state), str_replace(
1011
- '{CLIENT_ID}', UrlEncode($this->client_id), str_replace(
1012
- '{API_KEY}', UrlEncode($this->api_key), str_replace(
1013
- '{SCOPE}', UrlEncode($this->scope),
1014
- $url)))));
1015
- return(true);
1016
- }
1017
-
1018
- Function GetAccessTokenURL(&$access_token_url)
1019
- {
1020
- $access_token_url = str_replace('{API_KEY}', $this->api_key, $this->access_token_url);
1021
- return(true);
1022
- }
1023
-
1024
- Function GetStoredState(&$state)
1025
- {
1026
- if(!function_exists('session_start'))
1027
- return $this->SetError('Session variables are not accessible in this PHP environment');
1028
- if(session_id() === ''
1029
- && !session_start())
1030
- return($this->SetPHPError('it was not possible to start the PHP session'));
1031
- if(IsSet($_SESSION['OAUTH_STATE']))
1032
- $state = $_SESSION['OAUTH_STATE'];
1033
- else
1034
- $state = $_SESSION['OAUTH_STATE'] = time().'-'.substr(md5(rand().time()), 0, 6);
1035
- return(true);
1036
- }
1037
-
1038
- Function GetRequestState(&$state)
1039
- {
1040
- $check = (strlen($this->append_state_to_redirect_uri) ? $this->append_state_to_redirect_uri : 'state');
1041
- $state = (IsSet($_GET[$check]) ? $_GET[$check] : null);
1042
- return(true);
1043
- }
1044
-
1045
- Function GetRequestCode(&$code)
1046
- {
1047
- $code = (IsSet($_GET['code']) ? $_GET['code'] : null);
1048
- return(true);
1049
- }
1050
-
1051
- Function GetRequestError(&$error)
1052
- {
1053
- $error = (IsSet($_GET['error']) ? $_GET['error'] : null);
1054
- return(true);
1055
- }
1056
-
1057
- Function GetRequestDenied(&$denied)
1058
- {
1059
- $denied = (IsSet($_GET['denied']) ? $_GET['denied'] : null);
1060
- return(true);
1061
- }
1062
-
1063
- Function GetRequestToken(&$token, &$verifier)
1064
- {
1065
- $token = (IsSet($_GET['oauth_token']) ? $_GET['oauth_token'] : null);
1066
- $verifier = (IsSet($_GET['oauth_verifier']) ? $_GET['oauth_verifier'] : null);
1067
- return(true);
1068
- }
1069
-
1070
- Function GetRedirectURI(&$redirect_uri)
1071
- {
1072
- if(strlen($this->redirect_uri))
1073
- $redirect_uri = $this->redirect_uri;
1074
- else
1075
- $redirect_uri = html_entity_decode(esc_url('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']));
1076
- return true;
1077
- }
1078
-
1079
- /*
1080
- {metadocument}
1081
- <function>
1082
- <name>Redirect</name>
1083
- <type>VOID</type>
1084
- <documentation>
1085
- <purpose>Redirect the user browser to a given page.</purpose>
1086
- <usage>This function is meant to be only be called from inside the
1087
- class. By default it issues HTTP 302 response status and sets the
1088
- redirection location to a given URL. Sub-classes may override this
1089
- function to implement a different way to redirect the user
1090
- browser.</usage>
1091
- </documentation>
1092
- <argument>
1093
- <name>url</name>
1094
- <type>STRING</type>
1095
- <documentation>
1096
- <purpose>String with the full URL of the page to redirect.</purpose>
1097
- </documentation>
1098
- </argument>
1099
- <do>
1100
- {/metadocument}
1101
- */
1102
- Function Redirect($url)
1103
- {
1104
- Header('HTTP/1.0 302 OAuth Redirection');
1105
- Header('Location: '.$url);
1106
- }
1107
- /*
1108
- {metadocument}
1109
- </do>
1110
- </function>
1111
- {/metadocument}
1112
- */
1113
-
1114
- /*
1115
- {metadocument}
1116
- <function>
1117
- <name>StoreAccessToken</name>
1118
- <type>BOOLEAN</type>
1119
- <documentation>
1120
- <purpose>Store the values of the access token when it is succefully
1121
- retrieved from the OAuth server.</purpose>
1122
- <usage>This function is meant to be only be called from inside the
1123
- class. By default it stores access tokens in a session variable
1124
- named <stringvalue>OAUTH_ACCESS_TOKEN</stringvalue>.<paragraphbreak />
1125
- Actual implementations should create a sub-class and override this
1126
- function to make the access token values be stored in other types
1127
- of containers, like for instance databases.</usage>
1128
- <returnvalue>This function should return
1129
- <booleanvalue>1</booleanvalue> if the access token was stored
1130
- successfully.</returnvalue>
1131
- </documentation>
1132
- <argument>
1133
- <name>access_token</name>
1134
- <type>HASH</type>
1135
- <documentation>
1136
- <purpose>Associative array with properties of the access token.
1137
- The array may have set the following
1138
- properties:<paragraphbreak />
1139
- <stringvalue>value</stringvalue>: string value of the access
1140
- token<paragraphbreak />
1141
- <stringvalue>authorized</stringvalue>: boolean value that
1142
- determines if the access token was obtained
1143
- successfully<paragraphbreak />
1144
- <stringvalue>expiry</stringvalue>: (optional) timestamp in ISO
1145
- format relative to UTC time zone of the access token expiry
1146
- time<paragraphbreak />
1147
- <stringvalue>type</stringvalue>: (optional) type of OAuth token
1148
- that may determine how it should be used when sending API call
1149
- requests.<paragraphbreak />
1150
- <stringvalue>refresh</stringvalue>: (optional) token that some
1151
- servers may set to allowing refreshing access tokens when they
1152
- expire.</purpose>
1153
- </documentation>
1154
- </argument>
1155
- <do>
1156
- {/metadocument}
1157
- */
1158
- Function StoreAccessToken($access_token)
1159
- {
1160
- if(!function_exists('session_start'))
1161
- return $this->SetError('Session variables are not accessible in this PHP environment');
1162
- if(session_id() === ''
1163
- && !session_start())
1164
- return($this->SetPHPError('it was not possible to start the PHP session'));
1165
- if(!$this->GetAccessTokenURL($access_token_url))
1166
- return false;
1167
- $_SESSION['OAUTH_ACCESS_TOKEN'][$access_token_url] = $access_token;
1168
- return true;
1169
- }
1170
- /*
1171
- {metadocument}
1172
- </do>
1173
- </function>
1174
- {/metadocument}
1175
- */
1176
-
1177
- /*
1178
- {metadocument}
1179
- <function>
1180
- <name>GetAccessToken</name>
1181
- <type>BOOLEAN</type>
1182
- <documentation>
1183
- <purpose>Retrieve the OAuth access token if it was already
1184
- previously stored by the
1185
- <functionlink>StoreAccessToken</functionlink> function.</purpose>
1186
- <usage>This function is meant to be only be called from inside the
1187
- class. By default it retrieves access tokens stored in a session
1188
- variable named
1189
- <stringvalue>OAUTH_ACCESS_TOKEN</stringvalue>.<paragraphbreak />
1190
- Actual implementations should create a sub-class and override this
1191
- function to retrieve the access token values from other types of
1192
- containers, like for instance databases.</usage>
1193
- <returnvalue>This function should return
1194
- <booleanvalue>1</booleanvalue> if the access token was retrieved
1195
- successfully.</returnvalue>
1196
- </documentation>
1197
- <argument>
1198
- <name>access_token</name>
1199
- <type>STRING</type>
1200
- <out />
1201
- <documentation>
1202
- <purpose>Return the properties of the access token in an
1203
- associative array. If the access token was not yet stored, it
1204
- returns an empty array. Otherwise, the properties it may return
1205
- are the same that may be passed to the
1206
- <functionlink>StoreAccessToken</functionlink>.</purpose>
1207
- </documentation>
1208
- </argument>
1209
- <do>
1210
- {/metadocument}
1211
- */
1212
- Function GetAccessToken(&$access_token)
1213
- {
1214
- if(!function_exists('session_start'))
1215
- return $this->SetError('Session variables are not accessible in this PHP environment');
1216
- if(session_id() === ''
1217
- && !session_start())
1218
- return($this->SetPHPError('it was not possible to start the PHP session'));
1219
- if(!$this->GetAccessTokenURL($access_token_url))
1220
- return false;
1221
- if(IsSet($_SESSION['OAUTH_ACCESS_TOKEN'][$access_token_url]))
1222
- $access_token = $_SESSION['OAUTH_ACCESS_TOKEN'][$access_token_url];
1223
- else
1224
- $access_token = array();
1225
- return true;
1226
- }
1227
- /*
1228
- {metadocument}
1229
- </do>
1230
- </function>
1231
- {/metadocument}
1232
- */
1233
-
1234
- /*
1235
- {metadocument}
1236
- <function>
1237
- <name>ResetAccessToken</name>
1238
- <type>BOOLEAN</type>
1239
- <documentation>
1240
- <purpose>Reset the access token to a state back when the user has
1241
- not yet authorized the access to the OAuth server API.</purpose>
1242
- <usage>Call this function if for some reason the token to access
1243
- the API was revoked and you need to ask the user to authorize
1244
- the access again.<paragraphbreak />
1245
- By default the class stores and retrieves access tokens in a
1246
- session variable named
1247
- <stringvalue>OAUTH_ACCESS_TOKEN</stringvalue>.<paragraphbreak />
1248
- This function must be called when the user is accessing your site
1249
- pages, so it can reset the information stored in session variables
1250
- that cache the state of a previously retrieved access
1251
- token.<paragraphbreak />
1252
- Actual implementations should create a sub-class and override this
1253
- function to reset the access token state when it is stored in
1254
- other types of containers, like for instance databases.</usage>
1255
- <returnvalue>This function should return
1256
- <booleanvalue>1</booleanvalue> if the access token was resetted
1257
- successfully.</returnvalue>
1258
- </documentation>
1259
- <do>
1260
- {/metadocument}
1261
- */
1262
- Function ResetAccessToken()
1263
- {
1264
- if(!$this->GetAccessTokenURL($access_token_url))
1265
- return false;
1266
- if($this->debug)
1267
- $this->OutputDebug('Resetting the access token status for OAuth server located at '.$access_token_url);
1268
- if(!function_exists('session_start'))
1269
- return $this->SetError('Session variables are not accessible in this PHP environment');
1270
- if(session_id() === ''
1271
- && !session_start())
1272
- return($this->SetPHPError('it was not possible to start the PHP session'));
1273
- if(IsSet($_SESSION['OAUTH_ACCESS_TOKEN'][$access_token_url]))
1274
- Unset($_SESSION['OAUTH_ACCESS_TOKEN'][$access_token_url]);
1275
- return true;
1276
- }
1277
- /*
1278
- {metadocument}
1279
- </do>
1280
- </function>
1281
- {/metadocument}
1282
- */
1283
-
1284
- Function Encode($value)
1285
- {
1286
- return(is_array($value) ? $this->EncodeArray($value) : str_replace('%7E', '~', str_replace('+',' ', RawURLEncode($value))));
1287
- }
1288
-
1289
- Function EncodeArray($array)
1290
- {
1291
- foreach($array as $key => $value)
1292
- $array[$key] = $this->Encode($value);
1293
- return $array;
1294
- }
1295
-
1296
- Function HMAC($function, $data, $key)
1297
- {
1298
- switch($function)
1299
- {
1300
- case 'sha1':
1301
- $pack = 'H40';
1302
- break;
1303
- default:
1304
- if($this->debug)
1305
- $this->OutputDebug($function.' is not a supported an HMAC hash type');
1306
- return('');
1307
- }
1308
- if(strlen($key) > 64)
1309
- $key = pack($pack, $function($key));
1310
- if(strlen($key) < 64)
1311
- $key = str_pad($key, 64, "\0");
1312
- return(pack($pack, $function((str_repeat("\x5c", 64) ^ $key).pack($pack, $function((str_repeat("\x36", 64) ^ $key).$data)))));
1313
- }
1314
-
1315
- Function Sign(&$url, $method, $parameters, $oauth, $request_content_type, $has_files, $post_values_in_uri, &$authorization, &$post_values)
1316
- {
1317
- $values = array(
1318
- 'oauth_consumer_key'=>$this->client_id,
1319
- 'oauth_nonce'=>md5(uniqid(rand(), true)),
1320
- 'oauth_signature_method'=>$this->signature_method,
1321
- 'oauth_timestamp'=>time(),
1322
- 'oauth_version'=>'1.0',
1323
- );
1324
- if($has_files)
1325
- $value_parameters = array();
1326
- else
1327
- {
1328
- if(($this->url_parameters
1329
- || $method !== 'POST')
1330
- && $request_content_type === 'application/x-www-form-urlencoded'
1331
- && count($parameters))
1332
- {
1333
- $first = (strpos($url, '?') === false);
1334
- foreach($parameters as $parameter => $value)
1335
- {
1336
- $url .= ($first ? '?' : '&').UrlEncode($parameter).'='.UrlEncode($value);
1337
- $first = false;
1338
- }
1339
- $parameters = array();
1340
- }
1341
- $value_parameters = (($request_content_type !== 'application/x-www-form-urlencoded') ? array() : $parameters);
1342
- }
1343
- $header_values = ($method === 'GET' ? array_merge($values, $oauth, $value_parameters) : array_merge($values, $oauth));
1344
- $values = array_merge($values, $oauth, $value_parameters);
1345
- $key = $this->Encode($this->client_secret).'&'.$this->Encode($this->access_token_secret);
1346
- switch($this->signature_method)
1347
- {
1348
- case 'PLAINTEXT':
1349
- $values['oauth_signature'] = $key;
1350
- break;
1351
- case 'HMAC-SHA1':
1352
- $uri = strtok($url, '?');
1353
- $sign = $method.'&'.$this->Encode($uri).'&';
1354
- $first = true;
1355
- $sign_values = $values;
1356
- $u = parse_url($url);
1357
- if(IsSet($u['query']))
1358
- {
1359
- parse_str($u['query'], $q);
1360
- foreach($q as $parameter => $value)
1361
- $sign_values[$parameter] = $value;
1362
- }
1363
- KSort($sign_values);
1364
- foreach($sign_values as $parameter => $value)
1365
- {
1366
- $sign .= $this->Encode(($first ? '' : '&').$parameter.'='.$this->Encode($value));
1367
- $first = false;
1368
- }
1369
- $header_values['oauth_signature'] = $values['oauth_signature'] = base64_encode($this->HMAC('sha1', $sign, $key));
1370
- break;
1371
- default:
1372
- return $this->SetError($this->signature_method.' signature method is not yet supported');
1373
- }
1374
- if($this->authorization_header)
1375
- {
1376
- $authorization = 'OAuth';
1377
- $first = true;
1378
- foreach($header_values as $parameter => $value)
1379
- {
1380
- $authorization .= ($first ? ' ' : ',').$parameter.'="'.$this->Encode($value).'"';
1381
- $first = false;
1382
- }
1383
- $post_values = $parameters;
1384
- }
1385
- else
1386
- {
1387
- if($method !== 'POST'
1388
- || $post_values_in_uri)
1389
- {
1390
- $first = (strcspn($url, '?') == strlen($url));
1391
- foreach($values as $parameter => $value)
1392
- {
1393
- $url .= ($first ? '?' : '&').$parameter.'='.$this->Encode($value);
1394
- $first = false;
1395
- }
1396
- $post_values = array();
1397
- }
1398
- else
1399
- $post_values = $values;
1400
- }
1401
- return true;
1402
- }
1403
-
1404
- Function SendAPIRequest($url, $method, $parameters, $oauth, $options, &$response)
1405
- {
1406
- $this->response_status = 0;
1407
- $http = new http_class;
1408
- $http->debug = ($this->debug && $this->debug_http);
1409
- $http->log_debug = true;
1410
- $http->sasl_authenticate = 0;
1411
- $http->user_agent = $this->oauth_user_agent;
1412
- $http->redirection_limit = (IsSet($options['FollowRedirection']) ? intval($options['FollowRedirection']) : 0);
1413
- $http->follow_redirect = ($http->redirection_limit != 0);
1414
- if($this->debug)
1415
- $this->OutputDebug('Accessing the '.$options['Resource'].' at '.$url);
1416
- $post_files = array();
1417
- $method = strtoupper($method);
1418
- $authorization = '';
1419
- $request_content_type = (IsSet($options['RequestContentType']) ? strtolower(trim(strtok($options['RequestContentType'], ';'))) : (($method === 'POST' || IsSet($oauth)) ? 'application/x-www-form-urlencoded' : ''));
1420
- $files = (IsSet($options['Files']) ? $options['Files'] : array());
1421
- if(count($files))
1422
- {
1423
- foreach($files as $name => $value)
1424
- {
1425
- if(!IsSet($parameters[$name]))
1426
- return($this->SetError('it was specified an file parameters named '.$name));
1427
- $file = array();
1428
- switch(IsSet($value['Type']) ? $value['Type'] : 'FileName')
1429
- {
1430
- case 'FileName':
1431
- $file['FileName'] = $parameters[$name];
1432
- break;
1433
- case 'Data':
1434
- $file['Data'] = $parameters[$name];
1435
- break;
1436
- default:
1437
- return($this->SetError($value['Type'].' is not a valid type for file '.$name));
1438
- }
1439
- $file['Content-Type'] = (IsSet($value['ContentType']) ? $value['ContentType'] : 'automatic/name');
1440
- $post_files[$name] = $file;
1441
- }
1442
- UnSet($parameters[$name]);
1443
- if($method !== 'POST')
1444
- {
1445
- $this->OutputDebug('For uploading files the method should be POST not '.$method);
1446
- $method = 'POST';
1447
- }
1448
- if($request_content_type !== 'multipart/form-data')
1449
- {
1450
- if(IsSet($options['RequestContentType']))
1451
- return($this->SetError('the request content type for uploading files should be multipart/form-data'));
1452
- $request_content_type = 'multipart/form-data';
1453
- }
1454
- }
1455
- if(IsSet($oauth))
1456
- {
1457
- if(!$this->Sign($url, $method, $parameters, $oauth, $request_content_type, count($files) !== 0, IsSet($options['PostValuesInURI']) && $options['PostValuesInURI'], $authorization, $post_values))
1458
- return false;
1459
- }
1460
- else
1461
- {
1462
- $post_values = $parameters;
1463
- if(count($parameters))
1464
- {
1465
- switch($request_content_type)
1466
- {
1467
- case 'application/x-www-form-urlencoded':
1468
- case 'multipart/form-data':
1469
- case 'application/json':
1470
- break;
1471
- default:
1472
- $first = (strpos($url, '?') === false);
1473
- foreach($parameters as $name => $value)
1474
- {
1475
- if(GetType($value) === 'array')
1476
- {
1477
- foreach($value as $index => $value)
1478
- {
1479
- $url .= ($first ? '?' : '&').$name.'='.UrlEncode($value);
1480
- $first = false;
1481
- }
1482
- }
1483
- else
1484
- {
1485
- $url .= ($first ? '?' : '&').$name.'='.UrlEncode($value);
1486
- $first = false;
1487
- }
1488
- }
1489
- }
1490
- }
1491
- }
1492
- if(strlen($authorization) === 0
1493
- && !strcasecmp($this->access_token_type, 'Bearer'))
1494
- $authorization = 'Bearer '.$this->access_token;
1495
- if(strlen($error = $http->GetRequestArguments($url, $arguments)))
1496
- return($this->SetError('it was not possible to open the '.$options['Resource'].' URL: '.$error));
1497
- if(strlen($error = $http->Open($arguments)))
1498
- return($this->SetError('it was not possible to open the '.$options['Resource'].' URL: '.$error));
1499
- if(count($post_files))
1500
- $arguments['PostFiles'] = $post_files;
1501
- $arguments['RequestMethod'] = $method;
1502
- switch($request_content_type)
1503
- {
1504
- case 'application/x-www-form-urlencoded':
1505
- case 'multipart/form-data':
1506
- if(IsSet($options['RequestBody']))
1507
- return($this->SetError('the request body is defined automatically from the parameters'));
1508
- $arguments['PostValues'] = $post_values;
1509
- break;
1510
- case 'application/json':
1511
- $arguments['Headers']['Content-Type'] = $options['RequestContentType'];
1512
- $arguments['Body'] = (IsSet($options['RequestBody']) ? $options['RequestBody'] : json_encode($parameters));
1513
- break;
1514
- default:
1515
- if(!IsSet($options['RequestBody']))
1516
- {
1517
- if(IsSet($options['RequestContentType']))
1518
- return($this->SetError('it was not specified the body value of the of the API call request'));
1519
- break;
1520
- }
1521
- $arguments['Headers']['Content-Type'] = $options['RequestContentType'];
1522
- $arguments['Body'] = $options['RequestBody'];
1523
- break;
1524
- }
1525
- $arguments['Headers']['Accept'] = (IsSet($options['Accept']) ? $options['Accept'] : '*/*');
1526
- switch($authentication = (IsSet($options['AccessTokenAuthentication']) ? strtolower($options['AccessTokenAuthentication']) : ''))
1527
- {
1528
- case 'basic':
1529
- $arguments['Headers']['Authorization'] = 'Basic '.base64_encode($this->client_id.':'.($this->get_token_with_api_key ? $this->api_key : $this->client_secret));
1530
- break;
1531
- case '':
1532
- if(strlen($authorization))
1533
- $arguments['Headers']['Authorization'] = $authorization;
1534
- break;
1535
- default:
1536
- return($this->SetError($authentication.' is not a supported authentication mechanism to retrieve an access token'));
1537
- }
1538
- if(IsSet($options['RequestHeaders']))
1539
- $arguments['Headers'] = array_merge($arguments['Headers'], $options['RequestHeaders']);
1540
- if(strlen($error = $http->SendRequest($arguments))
1541
- || strlen($error = $http->ReadReplyHeaders($headers)))
1542
- {
1543
- $http->Close();
1544
- return($this->SetError('it was not possible to retrieve the '.$options['Resource'].': '.$error));
1545
- }
1546
- $error = $http->ReadWholeReplyBody($data);
1547
- $http->Close();
1548
- if(strlen($error))
1549
- {
1550
- return($this->SetError('it was not possible to access the '.$options['Resource'].': '.$error));
1551
- }
1552
- $this->response_status = intval($http->response_status);
1553
- $content_type = (IsSet($options['ResponseContentType']) ? $options['ResponseContentType'] : (IsSet($headers['content-type']) ? strtolower(trim(strtok($headers['content-type'], ';'))) : 'unspecified'));
1554
- $content_type = preg_replace('/^(.+\\/).+\\+(.+)$/', '\\1\\2', $content_type);
1555
- switch($content_type)
1556
- {
1557
- case 'text/javascript':
1558
- case 'application/json':
1559
- if(!function_exists('json_decode'))
1560
- return($this->SetError('the JSON extension is not available in this PHP setup'));
1561
- $object = json_decode($data);
1562
- switch(GetType($object))
1563
- {
1564
- case 'object':
1565
- if(!IsSet($options['ConvertObjects'])
1566
- || !$options['ConvertObjects'])
1567
- $response = $object;
1568
- else
1569
- {
1570
- $response = array();
1571
- foreach($object as $property => $value)
1572
- $response[$property] = $value;
1573
- }
1574
- break;
1575
- case 'array':
1576
- $response = $object;
1577
- break;
1578
- default:
1579
- if(!IsSet($object))
1580
- return($this->SetError('it was not returned a valid JSON definition of the '.$options['Resource'].' values'));
1581
- $response = $object;
1582
- break;
1583
- }
1584
- break;
1585
- case 'application/x-www-form-urlencoded':
1586
- case 'text/plain':
1587
- case 'text/html':
1588
- parse_str($data, $response);
1589
- break;
1590
- case 'text/xml':
1591
- if(IsSet($options['DecodeXMLResponse']))
1592
- {
1593
- switch(strtolower($options['DecodeXMLResponse']))
1594
- {
1595
- case 'simplexml':
1596
- if($this->debug)
1597
- $this->OutputDebug('Decoding XML response with simplexml');
1598
- try
1599
- {
1600
- $response = @new SimpleXMLElement($data);
1601
- }
1602
- catch(Exception $exception)
1603
- {
1604
- return $this->SetError('Could not parse XML response: '.$exception->getMessage());
1605
- }
1606
- break 2;
1607
- default:
1608
- return $this->SetError($options['DecodeXML'].' is not a supported method to decode XML responses');
1609
- }
1610
- }
1611
- default:
1612
- $response = $data;
1613
- break;
1614
- }
1615
- if($this->response_status >= 200
1616
- && $this->response_status < 300)
1617
- $this->access_token_error = '';
1618
- else
1619
- {
1620
- $this->access_token_error = 'it was not possible to access the '.$options['Resource'].': it was returned an unexpected response status '.$http->response_status.' Response: '.$data;
1621
- if($this->debug)
1622
- $this->OutputDebug('Could not retrieve the OAuth access token. Error: '.$this->access_token_error);
1623
- if(IsSet($options['FailOnAccessError'])
1624
- && $options['FailOnAccessError'])
1625
- {
1626
- $this->error = $this->access_token_error;
1627
- return false;
1628
- }
1629
- }
1630
- return true;
1631
- }
1632
-
1633
- Function ProcessToken1($oauth, &$access_token)
1634
- {
1635
- if(!$this->GetAccessTokenURL($url))
1636
- return false;
1637
- $options = array('Resource'=>'OAuth access token');
1638
- $method = strtoupper($this->token_request_method);
1639
- switch($method)
1640
- {
1641
- case 'GET':
1642
- break;
1643
- case 'POST':
1644
- $options['PostValuesInURI'] = true;
1645
- break;
1646
- default:
1647
- $this->error = $method.' is not a supported method to request tokens';
1648
- return false;
1649
- }
1650
- if(!$this->SendAPIRequest($url, $method, array(), $oauth, $options, $response))
1651
- return false;
1652
- if(strlen($this->access_token_error))
1653
- {
1654
- $this->authorization_error = $this->access_token_error;
1655
- return true;
1656
- }
1657
- if(!IsSet($response['oauth_token'])
1658
- || !IsSet($response['oauth_token_secret']))
1659
- {
1660
- $this->authorization_error= 'it was not returned the access token and secret';
1661
- return true;
1662
- }
1663
- $access_token = array(
1664
- 'value'=>$response['oauth_token'],
1665
- 'secret'=>$response['oauth_token_secret'],
1666
- 'authorized'=>true
1667
- );
1668
- if(IsSet($response['oauth_expires_in'])
1669
- && $response['oauth_expires_in'] == 0)
1670
- {
1671
- if($this->debug)
1672
- $this->OutputDebug('Ignoring access token expiry set to 0');
1673
- $this->access_token_expiry = '';
1674
- }
1675
- elseif(IsSet($response['oauth_expires_in']))
1676
- {
1677
- $expires = $response['oauth_expires_in'];
1678
- if(strval($expires) !== strval(intval($expires))
1679
- || $expires <= 0)
1680
- return($this->SetError('OAuth server did not return a supported type of access token expiry time'));
1681
- $this->access_token_expiry = gmstrftime('%Y-%m-%d %H:%M:%S', time() + $expires);
1682
- if($this->debug)
1683
- $this->OutputDebug('Access token expiry: '.$this->access_token_expiry.' UTC');
1684
- $access_token['expiry'] = $this->access_token_expiry;
1685
- }
1686
- else
1687
- $this->access_token_expiry = '';
1688
- if(IsSet($response['oauth_session_handle']))
1689
- {
1690
- $access_token['refresh'] = $response['oauth_session_handle'];
1691
- if($this->debug)
1692
- $this->OutputDebug('Refresh token: '.$access_token['refresh']);
1693
- }
1694
- return $this->StoreAccessToken($access_token);
1695
- }
1696
-
1697
- Function ProcessToken2($code, $refresh)
1698
- {
1699
- if(!$this->GetRedirectURI($redirect_uri))
1700
- return false;
1701
- $authentication = $this->access_token_authentication;
1702
- if(strlen($this->oauth_username))
1703
- {
1704
- $values = array(
1705
- 'grant_type'=>'password',
1706
- 'username'=>$this->oauth_username,
1707
- 'password'=>$this->oauth_password,
1708
- 'redirect_uri' => $redirect_uri
1709
- );
1710
- $authentication = 'Basic';
1711
- }
1712
- elseif($this->redirect_uri === 'oob'
1713
- && strlen($this->pin))
1714
- {
1715
- $values = array(
1716
- 'grant_type'=>'pin',
1717
- 'pin'=>$this->pin,
1718
- 'scope'=>$this->scope,
1719
- );
1720
- }
1721
- elseif($refresh)
1722
- {
1723
- $values = array(
1724
- 'refresh_token'=>$this->refresh_token,
1725
- 'grant_type'=>'refresh_token',
1726
- 'scope'=>$this->scope,
1727
- );
1728
- }
1729
- else
1730
- {
1731
- switch($this->grant_type)
1732
- {
1733
- case 'password':
1734
- return $this->SetError('it was not specified the username for obtaining a password based OAuth 2 authorization');
1735
- case 'authorization_code':
1736
- $values = array(
1737
- 'code'=>$code,
1738
- 'redirect_uri'=>$redirect_uri,
1739
- 'grant_type'=>'authorization_code'
1740
- );
1741
- break;
1742
- case 'client_credentials':
1743
- $values = array(
1744
- 'grant_type'=>'client_credentials'
1745
- );
1746
- $authentication = 'Basic';
1747
- break;
1748
- default:
1749
- return $this->SetError($this->grant_type.' is not yet a supported OAuth 2 grant type');
1750
- }
1751
- }
1752
- $options = array(
1753
- 'Resource'=>'OAuth '.($refresh ? 'refresh' : 'access').' token',
1754
- 'ConvertObjects'=>true
1755
- );
1756
- switch(strtolower($authentication))
1757
- {
1758
- case 'basic':
1759
- $options['AccessTokenAuthentication'] = $authentication;
1760
- break;
1761
- case '':
1762
- $values['client_id'] = $this->client_id;
1763
- $values['client_secret'] = ($this->get_token_with_api_key ? $this->api_key : $this->client_secret);
1764
- break;
1765
- default:
1766
- return($this->SetError($authentication.' is not a supported authentication mechanism to retrieve an access token'));
1767
- }
1768
- if(!$this->GetAccessTokenURL($access_token_url))
1769
- return false;
1770
- if(!$this->SendAPIRequest($access_token_url, 'POST', $values, null, $options, $response))
1771
- return false;
1772
- if(strlen($this->access_token_error))
1773
- {
1774
- $this->authorization_error = $this->access_token_error;
1775
- return true;
1776
- }
1777
- if(!IsSet($response['access_token']))
1778
- {
1779
- if(IsSet($response['error']))
1780
- {
1781
- $this->authorization_error = 'it was not possible to retrieve the access token: it was returned the error: '.$response['error'];
1782
- return true;
1783
- }
1784
- return($this->SetError('OAuth server did not return the access token'));
1785
- }
1786
- $access_token = array(
1787
- 'value'=>($this->access_token = $response['access_token']),
1788
- 'authorized'=>true,
1789
- );
1790
- if($this->store_access_token_response)
1791
- $access_token['response'] = $this->access_token_response = $response;
1792
- if($this->debug)
1793
- $this->OutputDebug('Access token: '.$this->access_token);
1794
- if(IsSet($response['expires_in'])
1795
- && $response['expires_in'] == 0)
1796
- {
1797
- if($this->debug)
1798
- $this->OutputDebug('Ignoring access token expiry set to 0');
1799
- $this->access_token_expiry = '';
1800
- }
1801
- elseif(IsSet($response['expires'])
1802
- || IsSet($response['expires_in']))
1803
- {
1804
- $expires = (IsSet($response['expires']) ? $response['expires'] : $response['expires_in']);
1805
- if(strval($expires) !== strval(intval($expires))
1806
- || $expires <= 0)
1807
- return($this->SetError('OAuth server did not return a supported type of access token expiry time'));
1808
- $this->access_token_expiry = gmstrftime('%Y-%m-%d %H:%M:%S', time() + $expires);
1809
- if($this->debug)
1810
- $this->OutputDebug('Access token expiry: '.$this->access_token_expiry.' UTC');
1811
- $access_token['expiry'] = $this->access_token_expiry;
1812
- }
1813
- else
1814
- $this->access_token_expiry = '';
1815
- if(IsSet($response['token_type']))
1816
- {
1817
- $this->access_token_type = $response['token_type'];
1818
- if(strlen($this->access_token_type)
1819
- && $this->debug)
1820
- $this->OutputDebug('Access token type: '.$this->access_token_type);
1821
- $access_token['type'] = $this->access_token_type;
1822
- }
1823
- else
1824
- {
1825
- $this->access_token_type = $this->default_access_token_type;
1826
- if(strlen($this->access_token_type)
1827
- && $this->debug)
1828
- $this->OutputDebug('Assumed the default for OAuth access token type which is '.$this->access_token_type);
1829
- }
1830
- if(IsSet($response['refresh_token']))
1831
- {
1832
- $this->refresh_token = $response['refresh_token'];
1833
- if($this->debug)
1834
- $this->OutputDebug('Refresh token: '.$this->refresh_token);
1835
- $access_token['refresh'] = $this->refresh_token;
1836
- }
1837
- elseif(strlen($this->refresh_token))
1838
- {
1839
- if($this->debug)
1840
- $this->OutputDebug('Reusing previous refresh token: '.$this->refresh_token);
1841
- $access_token['refresh'] = $this->refresh_token;
1842
- }
1843
- return $this->StoreAccessToken($access_token);
1844
- }
1845
-
1846
- Function RetrieveToken(&$valid)
1847
- {
1848
- $valid = false;
1849
- if(!$this->GetAccessToken($access_token))
1850
- return false;
1851
- if(IsSet($access_token['value']))
1852
- {
1853
- $this->access_token_expiry = '';
1854
- $expired = (IsSet($access_token['expiry']) && strcmp($this->access_token_expiry = $access_token['expiry'], gmstrftime('%Y-%m-%d %H:%M:%S')) < 0);
1855
- if($expired)
1856
- {
1857
- if($this->debug)
1858
- $this->OutputDebug('The OAuth access token expired on '.$this->access_token_expiry.' UTC');
1859
- }
1860
- $this->access_token = $access_token['value'];
1861
- if(!$expired
1862
- && $this->debug)
1863
- $this->OutputDebug('The OAuth access token '.$this->access_token.' is valid');
1864
- if(IsSet($access_token['type']))
1865
- {
1866
- $this->access_token_type = $access_token['type'];
1867
- if(strlen($this->access_token_type)
1868
- && !$expired
1869
- && $this->debug)
1870
- $this->OutputDebug('The OAuth access token is of type '.$this->access_token_type);
1871
- }
1872
- else
1873
- {
1874
- $this->access_token_type = $this->default_access_token_type;
1875
- if(strlen($this->access_token_type)
1876
- && !$expired
1877
- && $this->debug)
1878
- $this->OutputDebug('Assumed the default for OAuth access token type which is '.$this->access_token_type);
1879
- }
1880
- if(IsSet($access_token['secret']))
1881
- {
1882
- $this->access_token_secret = $access_token['secret'];
1883
- if($this->debug
1884
- && !$expired
1885
- && strlen($this->access_token_secret))
1886
- $this->OutputDebug('The OAuth access token secret is '.$this->access_token_secret);
1887
- }
1888
- if(IsSet($access_token['refresh']))
1889
- $this->refresh_token = $access_token['refresh'];
1890
- else
1891
- $this->refresh_token = '';
1892
- $this->access_token_response = (($this->store_access_token_response && IsSet($access_token['response'])) ? $access_token['response'] : null);
1893
- $valid = true;
1894
- }
1895
- return true;
1896
- }
1897
- /*
1898
- {metadocument}
1899
- <function>
1900
- <name>CallAPI</name>
1901
- <type>BOOLEAN</type>
1902
- <documentation>
1903
- <purpose>Send a HTTP request to the Web services API using a
1904
- previously obtained authorization token via OAuth.</purpose>
1905
- <usage>This function can be used to call an API after having
1906
- previously obtained an access token through the OAuth protocol
1907
- using the <functionlink>Process</functionlink> function, or by
1908
- directly setting the variables
1909
- <variablelink>access_token</variablelink>, as well as
1910
- <variablelink>access_token_secret</variablelink> in case of using
1911
- OAuth 1.0 or 1.0a services.</usage>
1912
- <returnvalue>This function returns <booleanvalue>1</booleanvalue> if
1913
- the call was done successfully.</returnvalue>
1914
- </documentation>
1915
- <argument>
1916
- <name>url</name>
1917
- <type>STRING</type>
1918
- <documentation>
1919
- <purpose>URL of the API where the HTTP request will be sent.</purpose>
1920
- </documentation>
1921
- </argument>
1922
- <argument>
1923
- <name>method</name>
1924
- <type>STRING</type>
1925
- <documentation>
1926
- <purpose>HTTP method that will be used to send the request. It can
1927
- be <stringvalue>GET</stringvalue>,
1928
- <stringvalue>POST</stringvalue>,
1929
- <stringvalue>DELETE</stringvalue>, <stringvalue>PUT</stringvalue>,
1930
- etc..</purpose>
1931
- </documentation>
1932
- </argument>
1933
- <argument>
1934
- <name>parameters</name>
1935
- <type>HASH</type>
1936
- <documentation>
1937
- <purpose>Associative array with the names and values of the API
1938
- call request parameters.</purpose>
1939
- </documentation>
1940
- </argument>
1941
- <argument>
1942
- <name>options</name>
1943
- <type>HASH</type>
1944
- <documentation>
1945
- <purpose>Associative array with additional options to configure
1946
- the request. Currently it supports the following
1947
- options:<paragraphbreak />
1948
- <stringvalue>2Legged</stringvalue>: boolean option that
1949
- determines if the API request should be 2 legged. The default
1950
- value is <tt><booleanvalue>0</booleanvalue></tt>.<paragraphbreak />
1951
- <stringvalue>Accept</stringvalue>: content type value of the
1952
- Accept HTTP header to be sent in the API call HTTP request.
1953
- Some APIs require that a certain value be sent to specify
1954
- which version of the API is being called. The default value is
1955
- <stringvalue>*&#47;*</stringvalue>.<paragraphbreak />
1956
- <stringvalue>ConvertObjects</stringvalue>: boolean option that
1957
- determines if objects should be converted into arrays when the
1958
- response is returned in JSON format. The default value is
1959
- <booleanvalue>0</booleanvalue>.<paragraphbreak />
1960
- <stringvalue>DecodeXMLResponse</stringvalue>: name of the method
1961
- to decode XML responses. Currently only
1962
- <stringvalue>simplexml</stringvalue> is supported. It makes a
1963
- XML response be parsed and returned as a SimpleXMLElement
1964
- object.<paragraphbreak />
1965
- <stringvalue>FailOnAccessError</stringvalue>: boolean option
1966
- that determines if this functions should fail when the server
1967
- response status is not between 200 and 299. The default value
1968
- is <booleanvalue>0</booleanvalue>.<paragraphbreak />
1969
- <stringvalue>Files</stringvalue>: associative array with
1970
- details of the parameters that must be passed as file uploads.
1971
- The array indexes must have the same name of the parameters
1972
- to be sent as files. The respective array entry values must
1973
- also be associative arrays with the parameters for each file.
1974
- Currently it supports the following parameters:<paragraphbreak />
1975
- - <tt>Type</tt> - defines how the parameter value should be
1976
- treated. It can be <tt>'FileName'</tt> if the parameter value is
1977
- is the name of a local file to be uploaded. It may also be
1978
- <tt>'Data'</tt> if the parameter value is the actual data of
1979
- the file to be uploaded.<paragraphbreak />
1980
- - Default: <tt>'FileName'</tt><paragraphbreak />
1981
- - <tt>ContentType</tt> - MIME value of the content type of the
1982
- file. It can be <tt>'automatic/name'</tt> if the content type
1983
- should be determine from the file name extension.<paragraphbreak />
1984
- - Default: <tt>'automatic/name'</tt><paragraphbreak />
1985
- <stringvalue>PostValuesInURI</stringvalue>: boolean option to
1986
- determine that a POST request should pass the request values
1987
- in the URI. The default value is
1988
- <booleanvalue>0</booleanvalue>.<paragraphbreak />
1989
- <stringvalue>FollowRedirection</stringvalue>: limit number of
1990
- times that HTTP response redirects will be followed. If it is
1991
- set to <integervalue>0</integervalue>, redirection responses
1992
- fail in error. The default value is
1993
- <integervalue>0</integervalue>.<paragraphbreak />
1994
- <stringvalue>RequestBody</stringvalue>: request body data of a
1995
- custom type. The <stringvalue>RequestContentType</stringvalue>
1996
- option must be specified, so the
1997
- <stringvalue>RequestBody</stringvalue> option is considered.<paragraphbreak />
1998
- <stringvalue>RequestContentType</stringvalue>: content type that
1999
- should be used to send the request values. It can be either
2000
- <stringvalue>application/x-www-form-urlencoded</stringvalue>
2001
- for sending values like from Web forms, or
2002
- <stringvalue>application/json</stringvalue> for sending the
2003
- values encoded in JSON format. Other types are accepted if the
2004
- <stringvalue>RequestBody</stringvalue> option is specified.
2005
- The default value is
2006
- <stringvalue>application/x-www-form-urlencoded</stringvalue>.<paragraphbreak />
2007
- <stringvalue>RequestHeaders</stringvalue>: associative array of
2008
- custom headers to be sent with the API call. These headers
2009
- override any values set by the class when sending the API
2010
- call HTTP request.<paragraphbreak />
2011
- <stringvalue>Resource</stringvalue>: string with a label that
2012
- will be used in the error messages and debug log entries to
2013
- identify what operation the request is performing. The default
2014
- value is <stringvalue>API call</stringvalue>.<paragraphbreak />
2015
- <stringvalue>ResponseContentType</stringvalue>: content type
2016
- that should be considered when decoding the API request
2017
- response. This overrides the <tt>Content-Type</tt> header
2018
- returned by the server. If the content type is
2019
- <stringvalue>application/x-www-form-urlencoded</stringvalue>
2020
- the function will parse the data returning an array of
2021
- key-value pairs. If the content type is
2022
- <stringvalue>application/json</stringvalue> the response will
2023
- be decode as a JSON-encoded data type. Other content type
2024
- values will make the function return the original response
2025
- value as it was returned from the server. The default value
2026
- for this option is to use what the server returned in the
2027
- <tt>Content-Type</tt> header.</purpose>
2028
- </documentation>
2029
- </argument>
2030
- <argument>
2031
- <name>response</name>
2032
- <type>STRING</type>
2033
- <out />
2034
- <documentation>
2035
- <purpose>Return the value of the API response. If the value is
2036
- JSON encoded, this function will decode it and return the value
2037
- converted to respective types. If the value is form encoded,
2038
- this function will decode the response and return it as an
2039
- array. Otherwise, the class will return the value as a
2040
- string.</purpose>
2041
- </documentation>
2042
- </argument>
2043
- <do>
2044
- {/metadocument}
2045
- */
2046
- Function CallAPI($url, $method, $parameters, $options, &$response)
2047
- {
2048
- if(!IsSet($options['Resource']))
2049
- $options['Resource'] = 'API call';
2050
- if(!IsSet($options['ConvertObjects']))
2051
- $options['ConvertObjects'] = false;
2052
- if(strlen($this->access_token) === 0)
2053
- {
2054
- if(!$this->RetrieveToken($valid))
2055
- return false;
2056
- if(!$valid)
2057
- return $this->SetError('the access token is not set to a valid value');
2058
- }
2059
- switch(intval($this->oauth_version))
2060
- {
2061
- case 1:
2062
- if(strlen($this->access_token_expiry)
2063
- && strcmp($this->access_token_expiry, gmstrftime('%Y-%m-%d %H:%M:%S')) <= 0)
2064
- {
2065
- if(strlen($this->refresh_token) === 0)
2066
- return($this->SetError('the access token expired and no refresh token is available'));
2067
- if($this->debug)
2068
- $this->OutputDebug('Refreshing the OAuth access token expired on '.$this->access_token_expiry);
2069
- $oauth = array(
2070
- 'oauth_token'=>$this->access_token,
2071
- 'oauth_session_handle'=>$this->refresh_token
2072
- );
2073
- if(!$this->ProcessToken1($oauth, $access_token))
2074
- return false;
2075
- if(IsSet($options['FailOnAccessError'])
2076
- && $options['FailOnAccessError']
2077
- && strlen($this->authorization_error))
2078
- {
2079
- $this->error = $this->authorization_error;
2080
- return false;
2081
- }
2082
- if(!IsSet($access_token['authorized'])
2083
- || !$access_token['authorized'])
2084
- return($this->SetError('failed to obtain a renewed the expired access token'));
2085
- $this->access_token = $access_token['value'];
2086
- $this->access_token_secret = $access_token['secret'];
2087
- if(IsSet($access_token['refresh']))
2088
- $this->refresh_token = $access_token['refresh'];
2089
- }
2090
- $oauth = array(
2091
- (strlen($this->access_token_parameter) ? $this->access_token_parameter : 'oauth_token')=>((IsSet($options['2Legged']) && $options['2Legged']) ? '' : $this->access_token)
2092
- );
2093
- break;
2094
-
2095
- case 2:
2096
- if(strlen($this->access_token_expiry)
2097
- && strcmp($this->access_token_expiry, gmstrftime('%Y-%m-%d %H:%M:%S')) <= 0)
2098
- {
2099
- if(strlen($this->refresh_token) === 0)
2100
- return($this->SetError('the access token expired and no refresh token is available'));
2101
- if($this->debug)
2102
- $this->OutputDebug('Refreshing the OAuth access token expired on '.$this->access_token_expiry);
2103
- if(!$this->ProcessToken2(null, true))
2104
- return false;
2105
- if(IsSet($options['FailOnAccessError'])
2106
- && $options['FailOnAccessError']
2107
- && strlen($this->authorization_error))
2108
- {
2109
- $this->error = $this->authorization_error;
2110
- return false;
2111
- }
2112
- }
2113
- $oauth = null;
2114
- if(strcasecmp($this->access_token_type, 'Bearer'))
2115
- $url .= (strcspn($url, '?') < strlen($url) ? '&' : '?').(strlen($this->access_token_parameter) ? $this->access_token_parameter : 'access_token').'='.UrlEncode($this->access_token);
2116
- break;
2117
-
2118
- default:
2119
- return($this->SetError($this->oauth_version.' is not a supported version of the OAuth protocol'));
2120
- }
2121
- return($this->SendAPIRequest($url, $method, $parameters, $oauth, $options, $response));
2122
- }
2123
- /*
2124
- {metadocument}
2125
- </do>
2126
- </function>
2127
- {/metadocument}
2128
- */
2129
-
2130
- /*
2131
- {metadocument}
2132
- <function>
2133
- <name>Initialize</name>
2134
- <type>BOOLEAN</type>
2135
- <documentation>
2136
- <purpose>Initialize the class variables and internal state. It must
2137
- be called before calling other class functions.</purpose>
2138
- <usage>Set the <variablelink>server</variablelink> variable before
2139
- calling this function to let it initialize the class variables to
2140
- work with the specified server type. Alternatively, you can set
2141
- other class variables manually to make it work with servers that
2142
- are not yet built-in supported.</usage>
2143
- <returnvalue>This function returns <booleanvalue>1</booleanvalue> if
2144
- it was able to successfully initialize the class for the specified
2145
- server type.</returnvalue>
2146
- </documentation>
2147
- <do>
2148
- {/metadocument}
2149
- */
2150
- Function Initialize()
2151
- {
2152
- global $theChampOauthConfigurationFile;
2153
- if(strlen($this->server) === 0)
2154
- return true;
2155
- $this->oauth_version =
2156
- $this->dialog_url =
2157
- $this->pin_dialog_url =
2158
- $this->access_token_url =
2159
- $this->request_token_url =
2160
- $this->append_state_to_redirect_uri = '';
2161
- $this->authorization_header = true;
2162
- $this->url_parameters = false;
2163
- $this->token_request_method = 'GET';
2164
- $this->signature_method = 'HMAC-SHA1';
2165
- $this->access_token_authentication = '';
2166
- $this->access_token_parameter = '';
2167
- $this->default_access_token_type = '';
2168
- $this->store_access_token_response = false;
2169
- switch($this->server)
2170
- {
2171
- case 'Facebook':
2172
- $this->oauth_version = '2.0';
2173
- $this->dialog_url = 'https://www.facebook.com/dialog/oauth?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}';
2174
- $this->access_token_url = 'https://graph.facebook.com/oauth/access_token';
2175
- break;
2176
-
2177
- case 'github':
2178
- $this->oauth_version = '2.0';
2179
- $this->dialog_url = 'https://github.com/login/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}';
2180
- $this->access_token_url = 'https://github.com/login/oauth/access_token';
2181
- break;
2182
-
2183
- case 'Google':
2184
- $this->oauth_version = '2.0';
2185
- $this->dialog_url = 'https://accounts.google.com/o/oauth2/auth?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}';
2186
- $this->offline_dialog_url = 'https://accounts.google.com/o/oauth2/auth?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}&access_type=offline&approval_prompt=force';
2187
- $this->access_token_url = 'https://accounts.google.com/o/oauth2/token';
2188
- break;
2189
-
2190
- case 'LinkedIn':
2191
- $this->oauth_version = '1.0a';
2192
- $this->request_token_url = 'https://api.linkedin.com/uas/oauth/requestToken?scope={SCOPE}';
2193
- $this->dialog_url = 'https://api.linkedin.com/uas/oauth/authenticate';
2194
- $this->access_token_url = 'https://api.linkedin.com/uas/oauth/accessToken';
2195
- $this->url_parameters = true;
2196
- break;
2197
-
2198
- case 'Microsoft':
2199
- $this->oauth_version = '2.0';
2200
- $this->dialog_url = 'https://login.live.com/oauth20_authorize.srf?client_id={CLIENT_ID}&scope={SCOPE}&response_type=code&redirect_uri={REDIRECT_URI}&state={STATE}';
2201
- $this->access_token_url = 'https://login.live.com/oauth20_token.srf';
2202
- break;
2203
-
2204
- case 'Twitter':
2205
- $this->oauth_version = '1.0a';
2206
- $this->request_token_url = 'https://api.twitter.com/oauth/request_token';
2207
- $this->dialog_url = 'https://api.twitter.com/oauth/authenticate';
2208
- $this->access_token_url = 'https://api.twitter.com/oauth/access_token';
2209
- $this->url_parameters = false;
2210
- break;
2211
-
2212
- case 'Yahoo':
2213
- $this->oauth_version = '1.0a';
2214
- $this->request_token_url = 'https://api.login.yahoo.com/oauth/v2/get_request_token';
2215
- $this->dialog_url = 'https://api.login.yahoo.com/oauth/v2/request_auth';
2216
- $this->access_token_url = 'https://api.login.yahoo.com/oauth/v2/get_token';
2217
- $this->authorization_header = false;
2218
- break;
2219
-
2220
- default:
2221
- if(!($json = @file_get_contents($theChampOauthConfigurationFile))){
2222
- // use cUrl to get file contents
2223
- $curl = curl_init();
2224
- curl_setopt($curl, CURLOPT_URL, $theChampOauthConfigurationFile);
2225
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
2226
- curl_setopt($curl, CURLOPT_HEADER, false);
2227
- $json = curl_exec($curl);
2228
- curl_close($curl);
2229
- if(!$json){
2230
- if(!file_exists($theChampOauthConfigurationFile)){
2231
- return $this->SetError('the OAuth server configuration file '.$theChampOauthConfigurationFile.' does not exist');
2232
- }
2233
- return $this->SetPHPError('could not read the OAuth server configuration file '.$theChampOauthConfigurationFile);
2234
- }
2235
- }
2236
- $oauth_server = json_decode($json);
2237
- if(!IsSet($oauth_server))
2238
- return $this->SetPHPError('It was not possible to decode the OAuth server configuration file '.$theChampOauthConfigurationFile.' eventually due to incorrect format');
2239
- if(GetType($oauth_server) !== 'object')
2240
- return $this->SetError('It was not possible to decode the OAuth server configuration file '.$theChampOauthConfigurationFile.' because it does not correctly define a JSON object');
2241
- if(!IsSet($oauth_server->servers)
2242
- || GetType($oauth_server->servers) !== 'object')
2243
- return $this->SetError('It was not possible to decode the OAuth server configuration file '.$theChampOauthConfigurationFile.' because it does not correctly define a JSON object for servers');
2244
- if(!IsSet($oauth_server->servers->{$this->server}))
2245
- return($this->SetError($this->server.' is not yet a supported type of OAuth server. Please send a request in this class support forum (preferred) http://www.phpclasses.org/oauth-api , or if it is a security or private matter, contact the author Manuel Lemos mlemos@acm.org to request adding built-in support to this type of OAuth server.'));
2246
- $properties = $oauth_server->servers->{$this->server};
2247
- if(GetType($properties) !== 'object')
2248
- return $this->SetError('The OAuth server configuration file '.$theChampOauthConfigurationFile.' for the "'.$this->server.'" server does not correctly define a JSON object');
2249
- $types = array(
2250
- 'oauth_version'=>'string',
2251
- 'request_token_url'=>'string',
2252
- 'dialog_url'=>'string',
2253
- 'pin_dialog_url'=>'string',
2254
- 'offline_dialog_url'=>'string',
2255
- 'access_token_url'=>'string',
2256
- 'append_state_to_redirect_uri'=> 'string',
2257
- 'authorization_header'=>'boolean',
2258
- 'url_parameters' => 'boolean',
2259
- 'token_request_method'=>'string',
2260
- 'signature_method'=>'string',
2261
- 'access_token_authentication'=>'string',
2262
- 'access_token_parameter'=>'string',
2263
- 'default_access_token_type'=>'string',
2264
- 'store_access_token_response'=>'boolean'
2265
- );
2266
- $required = array(
2267
- 'oauth_version'=>array(),
2268
- 'request_token_url'=>array('1.0', '1.0a'),
2269
- 'dialog_url'=>array(),
2270
- 'access_token_url'=>array(),
2271
- );
2272
- foreach($properties as $property => $value)
2273
- {
2274
- if(!IsSet($types[$property]))
2275
- return $this->SetError($property.' is not a supported property for the "'.$this->server.'" server in the OAuth server configuration file '.$theChampOauthConfigurationFile);
2276
- $type = GetType($value);
2277
- $expected = $types[$property];
2278
- if($type !== $expected)
2279
- return $this->SetError(' the property "'.$property.'" for the "'.$this->server.'" server is not of type "'.$expected.'", it is of type "'.$type.'", in the OAuth server configuration file '.$theChampOauthConfigurationFile);
2280
- $this->{$property} = $value;
2281
- UnSet($required[$property]);
2282
- }
2283
- foreach($required as $property => $value)
2284
- {
2285
- if(count($value)
2286
- && in_array($this->oauth_version, $value))
2287
- return $this->SetError('the property "'.$property.'" is not defined for the "'.$this->server.'" server in the OAuth server configuration file '.$theChampOauthConfigurationFile);
2288
- }
2289
- break;
2290
- }
2291
- return(true);
2292
- }
2293
- /*
2294
- {metadocument}
2295
- </do>
2296
- </function>
2297
- {/metadocument}
2298
- */
2299
-
2300
- /*
2301
- {metadocument}
2302
- <function>
2303
- <name>Process</name>
2304
- <type>BOOLEAN</type>
2305
- <documentation>
2306
- <purpose>Process the OAuth protocol interaction with the OAuth
2307
- server.</purpose>
2308
- <usage>Call this function when you need to retrieve the OAuth access
2309
- token. Check the <variablelink>access_token</variablelink> to
2310
- determine if the access token was obtained successfully.</usage>
2311
- <returnvalue>This function returns <booleanvalue>1</booleanvalue> if
2312
- the OAuth protocol was processed without errors.</returnvalue>
2313
- </documentation>
2314
- <do>
2315
- {/metadocument}
2316
- */
2317
- Function Process()
2318
- {
2319
- if(strlen($this->access_token)
2320
- || strlen($this->access_token_secret))
2321
- {
2322
- if($this->debug)
2323
- $this->OutputDebug('The Process function should not be called again if the OAuth token was already set manually');
2324
- return $this->SetError('the OAuth token was already set');
2325
- }
2326
- switch(intval($this->oauth_version))
2327
- {
2328
- case 1:
2329
- $one_a = ($this->oauth_version === '1.0a');
2330
- if($this->debug)
2331
- $this->OutputDebug('Checking the OAuth token authorization state');
2332
- if(!$this->GetAccessToken($access_token))
2333
- return false;
2334
- if(IsSet($access_token['expiry']))
2335
- $this->access_token_expiry = $access_token['expiry'];
2336
- if(IsSet($access_token['authorized'])
2337
- && IsSet($access_token['value']))
2338
- {
2339
- $expired = (IsSet($access_token['expiry']) && strcmp($access_token['expiry'], gmstrftime('%Y-%m-%d %H:%M:%S')) <= 0);
2340
- if(!$access_token['authorized']
2341
- || $expired)
2342
- {
2343
- if($this->debug)
2344
- {
2345
- if($expired)
2346
- $this->OutputDebug('The OAuth token expired on '.$access_token['expiry'].'UTC');
2347
- else
2348
- $this->OutputDebug('The OAuth token is not yet authorized');
2349
- }
2350
- if($one_a
2351
- && $this->redirect_uri === 'oob'
2352
- && strlen($this->pin))
2353
- {
2354
- if($this->debug)
2355
- $this->OutputDebug('Checking the pin');
2356
- $this->access_token_secret = $access_token['secret'];
2357
- $oauth = array(
2358
- 'oauth_token'=>$access_token['value'],
2359
- 'oauth_verifier'=>$this->pin
2360
- );
2361
- if(!$this->ProcessToken1($oauth, $access_token))
2362
- return false;
2363
- if($this->debug)
2364
- $this->OutputDebug('The OAuth token was authorized');
2365
- }
2366
- else
2367
- {
2368
- if($this->debug)
2369
- $this->OutputDebug('Checking the OAuth token and verifier');
2370
- if(!$this->GetRequestToken($token, $verifier))
2371
- return false;
2372
- if(!IsSet($token)
2373
- || ($one_a
2374
- && !IsSet($verifier)))
2375
- {
2376
- if(!$this->GetRequestDenied($denied))
2377
- return false;
2378
- if(IsSet($denied)
2379
- && $denied === $access_token['value'])
2380
- {
2381
- if($this->debug)
2382
- $this->OutputDebug('The authorization request was denied');
2383
- $this->authorization_error = 'the request was denied';
2384
- return true;
2385
- }
2386
- else
2387
- {
2388
- if($this->debug)
2389
- $this->OutputDebug('Reset the OAuth token state because token and verifier are not both set');
2390
- $access_token = array();
2391
- }
2392
- }
2393
- elseif($token !== $access_token['value'])
2394
- {
2395
- if($this->debug)
2396
- $this->OutputDebug('Reset the OAuth token state because token does not match what as previously retrieved');
2397
- $access_token = array();
2398
- }
2399
- else
2400
- {
2401
- $this->access_token_secret = $access_token['secret'];
2402
- $oauth = array(
2403
- 'oauth_token'=>$token,
2404
- );
2405
- if($one_a)
2406
- $oauth['oauth_verifier'] = $verifier;
2407
- if(!$this->ProcessToken1($oauth, $access_token))
2408
- return false;
2409
- if($this->debug)
2410
- $this->OutputDebug('The OAuth token was authorized');
2411
- }
2412
- }
2413
- }
2414
- elseif($this->debug)
2415
- $this->OutputDebug('The OAuth token was already authorized');
2416
- if(IsSet($access_token['authorized'])
2417
- && $access_token['authorized'])
2418
- {
2419
- $this->access_token = $access_token['value'];
2420
- $this->access_token_secret = $access_token['secret'];
2421
- if(IsSet($access_token['refresh']))
2422
- $this->refresh_token = $access_token['refresh'];
2423
- return true;
2424
- }
2425
- }
2426
- else
2427
- {
2428
- if($this->debug)
2429
- $this->OutputDebug('The OAuth access token is not set');
2430
- $access_token = array();
2431
- }
2432
- if(!IsSet($access_token['authorized']))
2433
- {
2434
- if($this->debug)
2435
- $this->OutputDebug('Requesting the unauthorized OAuth token');
2436
- if(!$this->GetRequestTokenURL($url))
2437
- return false;
2438
- $url = str_replace('{SCOPE}', UrlEncode($this->scope), $url);
2439
- if(!$this->GetRedirectURI($redirect_uri))
2440
- return false;
2441
- $oauth = array(
2442
- 'oauth_callback'=>$redirect_uri,
2443
- );
2444
- $options = array(
2445
- 'Resource'=>'OAuth request token',
2446
- 'FailOnAccessError'=>true
2447
- );
2448
- $method = strtoupper($this->token_request_method);
2449
- switch($method)
2450
- {
2451
- case 'GET':
2452
- break;
2453
- case 'POST':
2454
- $options['PostValuesInURI'] = true;
2455
- break;
2456
- default:
2457
- $this->error = $method.' is not a supported method to request tokens';
2458
- break;
2459
- }
2460
- if(!$this->SendAPIRequest($url, $method, array(), $oauth, $options, $response))
2461
- return false;
2462
- if(strlen($this->access_token_error))
2463
- {
2464
- $this->authorization_error = $this->access_token_error;
2465
- return true;
2466
- }
2467
- if(!IsSet($response['oauth_token'])
2468
- || !IsSet($response['oauth_token_secret']))
2469
- {
2470
- $this->authorization_error = 'it was not returned the requested token';
2471
- return true;
2472
- }
2473
- $access_token = array(
2474
- 'value'=>$response['oauth_token'],
2475
- 'secret'=>$response['oauth_token_secret'],
2476
- 'authorized'=>false
2477
- );
2478
- if(IsSet($response['login_url']))
2479
- $access_token['login_url'] = $response['login_url'];
2480
- if(!$this->StoreAccessToken($access_token))
2481
- return false;
2482
- }
2483
- if(!$this->GetDialogURL($url))
2484
- return false;
2485
- if($url === 'automatic')
2486
- {
2487
- if(!IsSet($access_token['login_url']))
2488
- return($this->SetError('The request token response did not automatically the login dialog URL as expected'));
2489
- if($this->debug)
2490
- $this->OutputDebug('Dialog URL obtained automatically from the request token response: '.$url);
2491
- $url = $access_token['login_url'];
2492
- }
2493
- else
2494
- $url .= (strpos($url, '?') === false ? '?' : '&').'oauth_token='.$access_token['value'];
2495
- if(!$one_a)
2496
- {
2497
- if(!$this->GetRedirectURI($redirect_uri))
2498
- return false;
2499
- $url .= '&oauth_callback='.UrlEncode($redirect_uri);
2500
- }
2501
- if($this->debug)
2502
- $this->OutputDebug('Redirecting to OAuth authorize page '.$url);
2503
- $this->Redirect($url);
2504
- $this->exit = true;
2505
- return true;
2506
-
2507
- case 2:
2508
- if($this->debug)
2509
- {
2510
- if(!$this->GetAccessTokenURL($access_token_url))
2511
- return false;
2512
- $this->OutputDebug('Checking if OAuth access token was already retrieved from '.$access_token_url);
2513
- }
2514
- if(!$this->RetrieveToken($valid))
2515
- return false;
2516
- $expired = (strlen($this->access_token_expiry) && strcmp($this->access_token_expiry, gmstrftime('%Y-%m-%d %H:%M:%S')) <= 0 && strlen($this->refresh_token) === 0);
2517
- if($valid
2518
- && !$expired)
2519
- return true;
2520
- if($this->debug)
2521
- {
2522
- if(!$valid)
2523
- $this->OutputDebug('A valid access token is not available');
2524
- elseif($expired)
2525
- $this->OutputDebug('The access token expired');
2526
- }
2527
- switch($this->grant_type)
2528
- {
2529
- case 'authorization_code':
2530
- if($this->redirect_uri === 'oob'
2531
- && strlen($this->pin))
2532
- {
2533
- if($this->debug)
2534
- $this->OutputDebug('Getting the access token using the pin');
2535
- return $this->ProcessToken2(null, false);
2536
- }
2537
- elseif(strlen($this->oauth_username) === 0)
2538
- break;
2539
- case 'password':
2540
- if($this->debug)
2541
- $this->OutputDebug('Getting the access token using the username and password');
2542
- return $this->ProcessToken2(null, false);
2543
- case 'client_credentials':
2544
- if($this->debug)
2545
- $this->OutputDebug('Getting the access token using the client credentials');
2546
- return $this->ProcessToken2(null, false);
2547
- default:
2548
- return $this->SetError($this->grant_type.' is not yet a supported OAuth 2 grant type');
2549
- }
2550
- if($this->debug)
2551
- $this->OutputDebug('Checking the authentication state in URI '.esc_url($_SERVER['REQUEST_URI']));
2552
- if(!$this->GetStoredState($stored_state))
2553
- return false;
2554
- if(strlen($stored_state) == 0)
2555
- return($this->SetError('it was not set the OAuth state'));
2556
- if(!$this->GetRequestState($state))
2557
- return false;
2558
- if($state === $stored_state)
2559
- {
2560
- if($this->debug)
2561
- $this->OutputDebug('Checking the authentication code');
2562
- if(!$this->GetRequestCode($code))
2563
- return false;
2564
- if(strlen($code) == 0)
2565
- {
2566
- if(!$this->GetRequestError($this->authorization_error))
2567
- return false;
2568
- if(IsSet($this->authorization_error))
2569
- {
2570
- if($this->debug)
2571
- $this->OutputDebug('Authorization failed with error code '.$this->authorization_error);
2572
- switch($this->authorization_error)
2573
- {
2574
- case 'invalid_request':
2575
- case 'unauthorized_client':
2576
- case 'access_denied':
2577
- case 'unsupported_response_type':
2578
- case 'invalid_scope':
2579
- case 'server_error':
2580
- case 'temporarily_unavailable':
2581
- case 'user_denied':
2582
- return true;
2583
- default:
2584
- return($this->SetError('it was returned an unknown OAuth error code'));
2585
- }
2586
- }
2587
- return($this->SetError('it was not returned the OAuth dialog code'));
2588
- }
2589
- if(!$this->ProcessToken2($code, false))
2590
- return false;
2591
- }
2592
- else
2593
- {
2594
- if(!$this->GetRedirectURI($redirect_uri))
2595
- return false;
2596
- if(strlen($this->append_state_to_redirect_uri))
2597
- $redirect_uri .= (strpos($redirect_uri, '?') === false ? '?' : '&').$this->append_state_to_redirect_uri.'='.$stored_state;
2598
- if(!$this->GetDialogURL($url, $redirect_uri, $stored_state))
2599
- return false;
2600
- if(strlen($url) == 0)
2601
- return($this->SetError('it was not set the OAuth dialog URL'));
2602
- if($this->debug)
2603
- $this->OutputDebug('Redirecting to OAuth Dialog '.$url);
2604
- $this->Redirect($url);
2605
- $this->exit = true;
2606
- }
2607
- break;
2608
-
2609
- default:
2610
- return($this->SetError($this->oauth_version.' is not a supported version of the OAuth protocol'));
2611
- }
2612
- return(true);
2613
- }
2614
- /*
2615
- {metadocument}
2616
- </do>
2617
- </function>
2618
- {/metadocument}
2619
- */
2620
-
2621
- /*
2622
- {metadocument}
2623
- <function>
2624
- <name>Finalize</name>
2625
- <type>BOOLEAN</type>
2626
- <documentation>
2627
- <purpose>Cleanup any resources that may have been used during the
2628
- OAuth protocol processing or execution of API calls.</purpose>
2629
- <usage>Always call this function as the last step after calling the
2630
- functions <functionlink>Process</functionlink> or
2631
- <functionlink>CallAPI</functionlink>.</usage>
2632
- <returnvalue>This function returns <booleanvalue>1</booleanvalue> if
2633
- the function cleaned up any resources successfully.</returnvalue>
2634
- </documentation>
2635
- <argument>
2636
- <name>success</name>
2637
- <type>BOOLEAN</type>
2638
- <documentation>
2639
- <purpose>Pass the last success state returned by the class or any
2640
- external code processing the class function results.</purpose>
2641
- </documentation>
2642
- </argument>
2643
- <do>
2644
- {/metadocument}
2645
- */
2646
- Function Finalize($success)
2647
- {
2648
- return($success);
2649
- }
2650
- /*
2651
- {metadocument}
2652
- </do>
2653
- </function>
2654
- {/metadocument}
2655
- */
2656
-
2657
- /*
2658
- {metadocument}
2659
- <function>
2660
- <name>Output</name>
2661
- <type>VOID</type>
2662
- <documentation>
2663
- <purpose>Display the results of the OAuth protocol processing.</purpose>
2664
- <usage>Only call this function if you are debugging the OAuth
2665
- authorization process and you need to view what was its
2666
- results.</usage>
2667
- </documentation>
2668
- <do>
2669
- {/metadocument}
2670
- */
2671
- Function Output()
2672
- {
2673
- if(strlen($this->authorization_error)
2674
- || strlen($this->access_token_error)
2675
- || strlen($this->access_token))
2676
- {
2677
- ?>
2678
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2679
- <html>
2680
- <head>
2681
- <title>OAuth client result</title>
2682
- </head>
2683
- <body>
2684
- <h1>OAuth client result</h1>
2685
- <?php
2686
- if(strlen($this->authorization_error))
2687
- {
2688
- ?>
2689
- <p>It was not possible to authorize the application.<?php
2690
- if($this->debug)
2691
- {
2692
- ?>
2693
- <br>Authorization error: <?php echo HtmlSpecialChars($this->authorization_error);
2694
- }
2695
- ?></p>
2696
- <?php
2697
- }
2698
- elseif(strlen($this->access_token_error))
2699
- {
2700
- ?>
2701
- <p>It was not possible to use the application access token.
2702
- <?php
2703
- if($this->debug)
2704
- {
2705
- ?>
2706
- <br>Error: <?php echo HtmlSpecialChars($this->access_token_error);
2707
- }
2708
- ?></p>
2709
- <?php
2710
- }
2711
- elseif(strlen($this->access_token))
2712
- {
2713
- ?>
2714
- <p>The application authorization was obtained successfully.
2715
- <?php
2716
- if($this->debug)
2717
- {
2718
- ?>
2719
- <br>Access token: <?php echo HtmlSpecialChars($this->access_token);
2720
- if(IsSet($this->access_token_secret))
2721
- {
2722
- ?>
2723
- <br>Access token secret: <?php echo HtmlSpecialChars($this->access_token_secret);
2724
- }
2725
- }
2726
- ?></p>
2727
- <?php
2728
- if(strlen($this->access_token_expiry))
2729
- {
2730
- ?>
2731
- <p>Access token expiry: <?php echo $this->access_token_expiry; ?> UTC</p>
2732
- <?php
2733
- }
2734
- }
2735
- ?>
2736
- </body>
2737
- </html>
2738
- <?php
2739
- }
2740
- }
2741
- /*
2742
- {metadocument}
2743
- </do>
2744
- </function>
2745
- {/metadocument}
2746
- */
2747
-
2748
- };
2749
-
2750
- /*
2751
-
2752
- {metadocument}
2753
- </class>
2754
- {/metadocument}
2755
-
2756
- */
2757
- }
2758
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
library/oauth_configuration.json DELETED
@@ -1,393 +0,0 @@
1
- {
2
- "version": "$Id: oauth_configuration.json,v 1.22 2014/12/05 05:09:11 mlemos Exp $",
3
- "comments": [
4
- "The servers entry should be an object with a list of object",
5
- "entries, one for each server type. The server object entry name is",
6
- "the name of the server type. Each server entry is an object with",
7
- "some mandatory properties: oauth_version, dialog_url,",
8
- "access_token_url and request_token_url (just for Oauth 1.0 and",
9
- "1.0a). Check the OAuth client class for the complete list of server",
10
- "properties."
11
- ],
12
- "servers":
13
- {
14
- "37Signals":
15
- {
16
- "oauth_version": "2.0",
17
- "dialog_url": "https://launchpad.37signals.com/authorization/new?type=web_server&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&scope={SCOPE}",
18
- "access_token_url": "https://launchpad.37signals.com/authorization/token?type=web_server"
19
- },
20
-
21
- "Amazon":
22
- {
23
- "oauth_version": "2.0",
24
- "dialog_url": "https://www.amazon.com/ap/oa?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
25
- "access_token_url": "https://api.amazon.com/auth/o2/token"
26
- },
27
-
28
- "Bitbucket":
29
- {
30
- "oauth_version": "1.0a",
31
- "request_token_url": "https://bitbucket.org/!api/1.0/oauth/request_token",
32
- "dialog_url": "https://bitbucket.org/!api/1.0/oauth/authenticate",
33
- "access_token_url": "https://bitbucket.org/!api/1.0/oauth/access_token",
34
- "url_parameters": false
35
- },
36
-
37
- "Bitly":
38
- {
39
- "oauth_version": "2.0",
40
- "dialog_url": "https://bitly.com/oauth/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&scope={SCOPE}",
41
- "access_token_url": "https://api-ssl.bitly.com/oauth/access_token"
42
- },
43
-
44
- "Box":
45
- {
46
- "oauth_version": "2.0",
47
- "dialog_url": "https://www.box.com/api/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&scope={SCOPE}",
48
- "offline_dialog_url": "https://www.box.com/api/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&access_type=offline&approval_prompt=force",
49
- "access_token_url": "https://www.box.com/api/oauth2/token"
50
- },
51
-
52
- "Buffer":
53
- {
54
- "oauth_version": "2.0",
55
- "dialog_url": "https://bufferapp.com/oauth2/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&scope={SCOPE}",
56
- "access_token_url": "https://api.bufferapp.com/1/oauth2/token.json"
57
- },
58
-
59
- "Copy":
60
- {
61
- "oauth_version": "1.0a",
62
- "request_token_url": "https://api.copy.com/oauth/request",
63
- "dialog_url": "https://www.copy.com/applications/authorize",
64
- "access_token_url": "https://api.copy.com/oauth/access"
65
- },
66
-
67
- "Dailymotion":
68
- {
69
- "oauth_version": "2.0",
70
- "dialog_url": "https://api.dailymotion.com/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&scope={SCOPE}",
71
- "access_token_url": "https://api.dailymotion.com/oauth/token"
72
- },
73
-
74
- "Discogs":
75
- {
76
- "oauth_version": "1.0a",
77
- "request_token_url": "https://api.discogs.com/oauth/request_token",
78
- "dialog_url": "https://www.discogs.com/oauth/authorize",
79
- "access_token_url": "https://api.discogs.com/oauth/access_token"
80
- },
81
-
82
- "Disqus":
83
- {
84
- "oauth_version": "2.0",
85
- "dialog_url": "https://disqus.com/api/oauth/2.0/authorize/?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
86
- "access_token_url": "https://disqus.com/api/oauth/2.0/access_token/"
87
- },
88
-
89
- "Dropbox":
90
- {
91
- "oauth_version": "1.0",
92
- "request_token_url": "https://api.dropbox.com/1/oauth/request_token",
93
- "dialog_url": "https://www.dropbox.com/1/oauth/authorize",
94
- "access_token_url": "https://api.dropbox.com/1/oauth/access_token",
95
- "authorization_header": false
96
- },
97
-
98
- "Dropbox2":
99
- {
100
- "oauth_version": "2.0",
101
- "dialog_url": "https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
102
- "access_token_url": "https://www.dropbox.com/1/oauth2/token"
103
- },
104
-
105
- "Etsy":
106
- {
107
- "oauth_version": "1.0a",
108
- "request_token_url": "https://openapi.etsy.com/v2/oauth/request_token?scope={SCOPE}",
109
- "dialog_url": "automatic",
110
- "access_token_url": "https://openapi.etsy.com/v2/oauth/access_token"
111
- },
112
-
113
- "Eventful":
114
- {
115
- "oauth_version": "1.0a",
116
- "request_token_url": "http://eventful.com/oauth/request_token",
117
- "dialog_url": "http://eventful.com/oauth/authorize",
118
- "access_token_url": "http://eventful.com/oauth/access_token",
119
- "authorization_header": false,
120
- "url_parameters": true,
121
- "token_request_method": "POST"
122
- },
123
-
124
- "Evernote":
125
- {
126
- "oauth_version": "1.0a",
127
- "request_token_url": "https://sandbox.evernote.com/oauth",
128
- "dialog_url": "https://sandbox.evernote.com/OAuth.action",
129
- "access_token_url": "https://sandbox.evernote.com/oauth",
130
- "url_parameters": true,
131
- "authorization_header": false
132
- },
133
-
134
- "Fitbit":
135
- {
136
- "oauth_version": "1.0a",
137
- "request_token_url": "http://api.fitbit.com/oauth/request_token",
138
- "dialog_url": "http://api.fitbit.com/oauth/authorize",
139
- "access_token_url": "http://api.fitbit.com/oauth/access_token"
140
- },
141
-
142
- "Flickr":
143
- {
144
- "oauth_version": "1.0a",
145
- "request_token_url": "http://www.flickr.com/services/oauth/request_token",
146
- "dialog_url": "http://www.flickr.com/services/oauth/authorize?perms={SCOPE}",
147
- "access_token_url": "http://www.flickr.com/services/oauth/access_token",
148
- "authorization_header": false
149
- },
150
-
151
- "Foursquare":
152
- {
153
- "oauth_version": "2.0",
154
- "dialog_url": "https://foursquare.com/oauth2/authorize?client_id={CLIENT_ID}&scope={SCOPE}&response_type=code&redirect_uri={REDIRECT_URI}&state={STATE}",
155
- "access_token_url": "https://foursquare.com/oauth2/access_token",
156
- "access_token_parameter": "oauth_token"
157
- },
158
-
159
- "Google1":
160
- {
161
- "oauth_version": "1.0a",
162
- "dialog_url": "https://www.google.com/accounts/OAuthAuthorizeToken",
163
- "access_token_url": "https://www.google.com/accounts/OAuthGetAccessToken",
164
- "request_token_url": "https://www.google.com/accounts/OAuthGetRequestToken?scope={SCOPE}"
165
- },
166
-
167
- "imgur":
168
- {
169
- "oauth_version": "2.0",
170
- "dialog_url": "https://api.imgur.com/oauth2/authorize?client_id={CLIENT_ID}&response_type=code&state={STATE}&redirect_uri={REDIRECT_URI}&scope={SCOPE}",
171
- "pin_dialog_url": "https://api.imgur.com/oauth2/authorize?client_id={CLIENT_ID}&response_type=pin&state={STATE}&scope={SCOPE}",
172
- "access_token_url": "https://api.imgur.com/oauth2/token"
173
- },
174
-
175
- "Instagram":
176
- {
177
- "oauth_version": "2.0",
178
- "dialog_url": "https://api.instagram.com/oauth/authorize/?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
179
- "access_token_url": "https://api.instagram.com/oauth/access_token"
180
- },
181
-
182
- "Intuit":
183
- {
184
- "oauth_version": "1.0a",
185
- "request_token_url": "https://oauth.intuit.com/oauth/v1/get_request_token",
186
- "dialog_url": "https://appcenter.intuit.com/Connect/Begin",
187
- "access_token_url": "https://oauth.intuit.com/oauth/v1/get_access_token"
188
- },
189
-
190
- "Jawbone":
191
- {
192
- "oauth_version": "2.0",
193
- "dialog_url": "https://jawbone.com/auth/oauth2/auth?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&scope={SCOPE}",
194
- "access_token_url": "https://jawbone.com/auth/oauth2/token"
195
- },
196
-
197
- "LinkedIn2":
198
- {
199
- "oauth_version": "2.0",
200
- "dialog_url": "https://www.linkedin.com/uas/oauth2/authorization?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
201
- "access_token_url": "https://www.linkedin.com/uas/oauth2/accessToken",
202
- "default_access_token_type": "Bearer"
203
- },
204
-
205
- "MailChimp":
206
- {
207
- "oauth_version": "2.0",
208
- "dialog_url": "https://login.mailchimp.com/oauth2/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
209
- "access_token_url": "https://login.mailchimp.com/oauth2/token"
210
- },
211
-
212
- "Mavenlink":
213
- {
214
- "oauth_version": "2.0",
215
- "dialog_url": "https://api.mavenlink.com/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
216
- "access_token_url": "https://api.mavenlink.com/oauth/token"
217
- },
218
-
219
- "mail.ru":
220
- {
221
- "oauth_version": "2.0",
222
- "dialog_url": "https://connect.mail.ru/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
223
- "access_token_url": "https://connect.mail.ru/oauth/token",
224
- "store_access_token_response": true
225
- },
226
-
227
- "oDesk":
228
- {
229
- "oauth_version": "1.0a",
230
- "request_token_url": "https://www.odesk.com/api/auth/v1/oauth/token/request",
231
- "dialog_url": "https://www.odesk.com/services/api/auth",
232
- "access_token_url": "https://www.odesk.com/api/auth/v1/oauth/token/access",
233
- "token_request_method": "POST"
234
- },
235
-
236
- "Paypal":
237
- {
238
- "oauth_version": "2.0",
239
- "dialog_url": "https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&scope={SCOPE}",
240
- "access_token_url": "https://api.paypal.com/v1/oauth2/token",
241
- "access_token_authentication": "basic"
242
- },
243
-
244
- "PaypalApplication":
245
- {
246
- "oauth_version": "2.0",
247
- "dialog_url": "use Paypal OAuth 2.0 for accessing its API on behalf of a given user",
248
- "access_token_url": "https://api.paypal.com/v1/oauth2/token",
249
- "access_token_authentication": "basic"
250
- },
251
-
252
- "Rdio":
253
- {
254
- "oauth_version": "1.0a",
255
- "request_token_url": "http://api.rdio.com/oauth/request_token",
256
- "dialog_url": "https://www.rdio.com/oauth/authorize",
257
- "access_token_url": "http://api.rdio.com/oauth/access_token"
258
- },
259
-
260
- "Reddit":
261
- {
262
- "oauth_version": "2.0",
263
- "dialog_url": "https://ssl.reddit.com/api/v1/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
264
- "offline_dialog_url": "https://ssl.reddit.com/api/v1/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}&duration=permanent",
265
- "access_token_url": "https://ssl.reddit.com/api/v1/access_token",
266
- "access_token_authentication": "basic"
267
- },
268
-
269
- "RightSignature":
270
- {
271
- "oauth_version": "1.0a",
272
- "request_token_url": "https://rightsignature.com/oauth/request_token",
273
- "dialog_url": "https://rightsignature.com/oauth/authorize",
274
- "access_token_url": "https://rightsignature.com/oauth/access_token",
275
- "authorization_header": false
276
- },
277
-
278
- "RunKeeper":
279
- {
280
- "oauth_version": "2.0",
281
- "dialog_url": "https://runkeeper.com/apps/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&scope={SCOPE}",
282
- "access_token_url": "https://runkeeper.com/apps/token"
283
- },
284
-
285
- "Salesforce":
286
- {
287
- "oauth_version": "2.0",
288
- "dialog_url": "https://login.salesforce.com/services/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
289
- "access_token_url": "https://login.salesforce.com/services/oauth2/token",
290
- "default_access_token_type": "Bearer",
291
- "store_access_token_response": true
292
- },
293
-
294
- "Scoop.it":
295
- {
296
- "oauth_version": "1.0a",
297
- "request_token_url": "https://www.scoop.it/oauth/request",
298
- "dialog_url": "https://www.scoop.it/oauth/authorize",
299
- "access_token_url": "https://www.scoop.it/oauth/access",
300
- "authorization_header": false
301
- },
302
-
303
- "StockTwits":
304
- {
305
- "oauth_version": "2.0",
306
- "dialog_url": "https://api.stocktwits.com/api/2/oauth/authorize?client_id={CLIENT_ID}&response_type=code&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
307
- "access_token_url": "https://api.stocktwits.com/api/2/oauth/token"
308
- },
309
-
310
- "SurveyMonkey":
311
- {
312
- "oauth_version": "2.0",
313
- "dialog_url": "https://api.surveymonkey.net/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&api_key={API_KEY}&scope={SCOPE}",
314
- "access_token_url": "https://api.surveymonkey.net/oauth/token?api_key={API_KEY}"
315
- },
316
-
317
- "TeamViewer":
318
- {
319
- "oauth_version": "2.0",
320
- "dialog_url": "https://webapi.teamviewer.com/api/v1/oauth2/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&api_key={API_KEY}&scope={SCOPE}",
321
- "access_token_url": "https://webapi.teamviewer.com/api/v1/oauth2/token"
322
- },
323
-
324
- "Tumblr":
325
- {
326
- "oauth_version": "1.0a",
327
- "request_token_url": "http://www.tumblr.com/oauth/request_token",
328
- "dialog_url": "http://www.tumblr.com/oauth/authorize",
329
- "access_token_url": "http://www.tumblr.com/oauth/access_token"
330
- },
331
-
332
- "Twitter2":
333
- {
334
- "oauth_version": "2.0",
335
- "dialog_url": "use Twitter OAuth 1.0a for accessing its API on behalf of a given user",
336
- "access_token_url": "https://api.twitter.com/oauth2/token"
337
- },
338
-
339
- "Vimeo":
340
- {
341
- "oauth_version": "2.0",
342
- "dialog_url": "https://api.vimeo.com/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&scope={SCOPE}",
343
- "access_token_url": "https://api.vimeo.com/oauth/access_token"
344
- },
345
-
346
- "VK":
347
- {
348
- "oauth_version": "2.0",
349
- "dialog_url": "https://oauth.vk.com/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
350
- "access_token_url": "https://oauth.vk.com/access_token"
351
- },
352
-
353
- "Withings":
354
- {
355
- "oauth_version": "1.0",
356
- "request_token_url": "https://oauth.withings.com/account/request_token",
357
- "dialog_url": "https://oauth.withings.com/account/authorize",
358
- "access_token_url": "https://oauth.withings.com/account/access_token",
359
- "authorization_header": false
360
- },
361
-
362
- "Wordpress":
363
- {
364
- "oauth_version": "2.0",
365
- "dialog_url": "https://public-api.wordpress.com/oauth2/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&scope={SCOPE}",
366
- "access_token_url": "https://public-api.wordpress.com/oauth2/token"
367
- },
368
-
369
- "Xero":
370
- {
371
- "oauth_version": "1.0a",
372
- "request_token_url": "https://api.xero.com/oauth/RequestToken",
373
- "dialog_url": "https://api.xero.com/oauth/Authorize",
374
- "access_token_url": "https://api.xero.com/oauth/AccessToken"
375
- },
376
-
377
- "XING":
378
- {
379
- "oauth_version": "1.0a",
380
- "request_token_url": "https://api.xing.com/v1/request_token",
381
- "dialog_url": "https://api.xing.com/v1/authorize",
382
- "access_token_url": "https://api.xing.com/v1/access_token",
383
- "authorization_header": false
384
- },
385
-
386
- "Yandex":
387
- {
388
- "oauth_version": "2.0",
389
- "dialog_url": "https://oauth.yandex.com/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&scope={SCOPE}",
390
- "access_token_url": "https://oauth.yandex.com/token"
391
- }
392
- }
393
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
library/twitteroauth.php DELETED
@@ -1,242 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * Abraham Williams (abraham@abrah.am) http://abrah.am
5
- *
6
- * The first PHP Library to support OAuth for Twitter's REST API.
7
- */
8
-
9
- require_once('oauth.php');
10
-
11
- if (!class_exists('TwitterOAuth')) {
12
- /**
13
- * Twitter OAuth class
14
- */
15
- class TwitterOAuth {
16
- /* Contains the last HTTP status code returned. */
17
- public $http_code;
18
- /* Contains the last API call. */
19
- public $url;
20
- /* Set up the API root URL. */
21
- public $host = "https://api.twitter.com/1.1/";
22
- /* Set timeout default. */
23
- public $timeout = 30;
24
- /* Set connect timeout. */
25
- public $connecttimeout = 30;
26
- /* Verify SSL Cert. */
27
- public $ssl_verifypeer = FALSE;
28
- /* Respons format. */
29
- public $format = 'json';
30
- /* Decode returned json data. */
31
- public $decode_json = TRUE;
32
- /* Contains the last HTTP headers returned. */
33
- public $http_info;
34
- /* Set the useragnet. */
35
- public $useragent = 'TwitterOAuth v0.2.0-beta2';
36
- /* Immediately retry the API call if the response was not successful. */
37
- //public $retry = TRUE;
38
-
39
-
40
-
41
-
42
- /**
43
- * Set API URLS
44
- */
45
- function accessTokenURL() { return 'https://api.twitter.com/oauth/access_token'; }
46
- function authenticateURL() { return 'https://api.twitter.com/oauth/authenticate'; }
47
- function authorizeURL() { return 'https://api.twitter.com/oauth/authorize'; }
48
- function requestTokenURL() { return 'https://api.twitter.com/oauth/request_token'; }
49
-
50
- /**
51
- * Debug helpers
52
- */
53
- function lastStatusCode() { return $this->http_status; }
54
- function lastAPICall() { return $this->last_api_call; }
55
-
56
- /**
57
- * construct TwitterOAuth object
58
- */
59
- function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {
60
- $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
61
- $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);
62
- if (!empty($oauth_token) && !empty($oauth_token_secret)) {
63
- $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
64
- } else {
65
- $this->token = NULL;
66
- }
67
- }
68
-
69
-
70
- /**
71
- * Get a request_token from Twitter
72
- *
73
- * @returns a key/value array containing oauth_token and oauth_token_secret
74
- */
75
- function getRequestToken($oauth_callback) {
76
- $parameters = array();
77
- $parameters['oauth_callback'] = $oauth_callback;
78
- $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);
79
- $token = OAuthUtil::parse_parameters($request);
80
- $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
81
- return $token;
82
- }
83
-
84
- /**
85
- * Get the authorize URL
86
- *
87
- * @returns a string
88
- */
89
- function getAuthorizeURL($token, $sign_in_with_twitter = TRUE) {
90
- if (is_array($token)) {
91
- $token = $token['oauth_token'];
92
- }
93
- if (empty($sign_in_with_twitter)) {
94
- return $this->authorizeURL() . "?oauth_token={$token}";
95
- } else {
96
- return $this->authenticateURL() . "?oauth_token={$token}";
97
- }
98
- }
99
-
100
- /**
101
- * Exchange request token and secret for an access token and
102
- * secret, to sign API calls.
103
- *
104
- * @returns array("oauth_token" => "the-access-token",
105
- * "oauth_token_secret" => "the-access-secret",
106
- * "user_id" => "9436992",
107
- * "screen_name" => "abraham")
108
- */
109
- function getAccessToken($oauth_verifier) {
110
- $parameters = array();
111
- $parameters['oauth_verifier'] = $oauth_verifier;
112
- $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);
113
- $token = OAuthUtil::parse_parameters($request);
114
- $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
115
- return $token;
116
- }
117
-
118
- /**
119
- * One time exchange of username and password for access token and secret.
120
- *
121
- * @returns array("oauth_token" => "the-access-token",
122
- * "oauth_token_secret" => "the-access-secret",
123
- * "user_id" => "9436992",
124
- * "screen_name" => "abraham",
125
- * "x_auth_expires" => "0")
126
- */
127
- function getXAuthToken($username, $password) {
128
- $parameters = array();
129
- $parameters['x_auth_username'] = $username;
130
- $parameters['x_auth_password'] = $password;
131
- $parameters['x_auth_mode'] = 'client_auth';
132
- $request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters);
133
- $token = OAuthUtil::parse_parameters($request);
134
- $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
135
- return $token;
136
- }
137
-
138
- /**
139
- * GET wrapper for oAuthRequest.
140
- */
141
- function get($url, $parameters = array()) {
142
- $response = $this->oAuthRequest($url, 'GET', $parameters);
143
- if ($this->format === 'json' && $this->decode_json) {
144
- return json_decode($response);
145
- }
146
- return $response;
147
- }
148
-
149
- /**
150
- * POST wrapper for oAuthRequest.
151
- */
152
- function post($url, $parameters = array()) {
153
- $response = $this->oAuthRequest($url, 'POST', $parameters);
154
- if ($this->format === 'json' && $this->decode_json) {
155
- return json_decode($response);
156
- }
157
- return $response;
158
- }
159
-
160
- /**
161
- * DELETE wrapper for oAuthReqeust.
162
- */
163
- function delete($url, $parameters = array()) {
164
- $response = $this->oAuthRequest($url, 'DELETE', $parameters);
165
- if ($this->format === 'json' && $this->decode_json) {
166
- return json_decode($response);
167
- }
168
- return $response;
169
- }
170
-
171
- /**
172
- * Format and sign an OAuth / API request
173
- */
174
- function oAuthRequest($url, $method, $parameters) {
175
- if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) {
176
- $url = "{$this->host}{$url}.{$this->format}";
177
- }
178
- $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
179
- $request->sign_request($this->sha1_method, $this->consumer, $this->token);
180
- switch ($method) {
181
- case 'GET':
182
- return $this->http($request->to_url(), 'GET');
183
- default:
184
- return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata());
185
- }
186
- }
187
-
188
- /**
189
- * Make an HTTP request
190
- *
191
- * @return API results
192
- */
193
- function http($url, $method, $postfields = NULL) {
194
- $this->http_info = array();
195
- $ci = curl_init();
196
- /* Curl settings */
197
- curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
198
- curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
199
- curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
200
- curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
201
- curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
202
- curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
203
- curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
204
- curl_setopt($ci, CURLOPT_HEADER, FALSE);
205
-
206
- switch ($method) {
207
- case 'POST':
208
- curl_setopt($ci, CURLOPT_POST, TRUE);
209
- if (!empty($postfields)) {
210
- curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
211
- }
212
- break;
213
- case 'DELETE':
214
- curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
215
- if (!empty($postfields)) {
216
- $url = "{$url}?{$postfields}";
217
- }
218
- }
219
-
220
- curl_setopt($ci, CURLOPT_URL, $url);
221
- $response = curl_exec($ci);
222
- $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
223
- $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
224
- $this->url = $url;
225
- curl_close ($ci);
226
- return $response;
227
- }
228
-
229
- /**
230
- * Get the header info to store.
231
- */
232
- function getHeader($ch, $header) {
233
- $i = strpos($header, ':');
234
- if (!empty($i)) {
235
- $key = str_replace('-', '_', strtolower(substr($header, 0, $i)));
236
- $value = trim(substr($header, $i + 2));
237
- $this->http_header[$key] = $value;
238
- }
239
- return strlen($header);
240
- }
241
- }
242
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
  === WordPress Social Share, Social Login and Social Comments Plugin - Super Socializer ===
2
  Contributors: Heateor, farhan8heateor, jatin8heateor, the_champ, Hungarian Translator: László Tavaszi http://kerekmese.hu, Chinese Translator: CalmSmile calmsmile.org, Portuguese Translator: Paulo Purkyt https://www.linkedin.com/in/ppurkyt, Italian Translator: FG3D (Freedom's Gate) https://fg3d.net, Spanish translator: Ignacio Iglesias http://trespies.com, Arabic Translator: http://www.ArabsSM.com, Russian/Ukrainian Translator: Nicholas Lagunov
3
  Donate link: https://www.heateor.com/donate?action=Super+Socializer
4
- Tags: social login, social share, social commenting, social comments, social plugin, profile data, social analytics, online identity, social profile storage, single sign-on, social media follow, facebook login, Twitch login
5
  Requires at least: 2.5.0
6
- Tested up to: 5.3
7
- Stable tag: 7.12.37
8
  License: GPLv2 or later
9
 
10
  The unique Social Plugin to let you integrate Social Login, Social Share, Social Comments and Social Media follow at your website
@@ -42,7 +42,7 @@ Integrate Social Login, Social Share and Social Comments at your website easiest
42
  * Mobile responsive sharing interface
43
  * Compatible with AMP
44
  * Enable/Disable vertical/floating sharing interface on mobile device
45
- * Social Login from 10 Social Networks - Facebook, Google, Linkedin, Twitter, Vkontakte, Instagram, Xing, Steam, Twitch and LiveJournal
46
  * Enable Social Login interface at WordPress Login, Register pages and comment form
47
  * Syncs user's basic social profile data with WordPress profile
48
  * Enable Social Login at WooCommerce checkout page and customer login form
@@ -211,23 +211,32 @@ Yes, we can help you with it. Just drop an email at support[ at ]heateor[ dot ]c
211
  8. **Social Commenting**: Disqus Commenting selected
212
 
213
  == Changelog ==
214
- = 7.12.37 [17 October 2019] =
 
 
 
 
 
 
 
 
 
215
  * [Improvement] Updated Facebook API to version 3.2 from version 2.10
216
 
217
- = 7.12.36 [16 October 2019] =
218
  * [Bugfix] Querystring Parameters in the url of webpage were resetting the Facebook Like and Facebook Recommend counts to zero
219
  * [Bugfix] Admin was not receiving new user notification email with Woocommerce active
220
 
221
- = 7.12.35 [25 September 2019] =
222
  * [Bugfix] Twitch login stopped working
223
  * [Security fix] Twitch login was not checking if user's email has been verified on Twitch
224
 
225
- = 7.12.34 [30 August 2019] =
226
  * [Bugfix] Using Twitch API v5 instead of v3, as it's going to shutdown
227
  * [Improvement] Twitch login is now saving users' email address too along with other profile details
228
  * [Improvement] Admin UI improvement
229
 
230
- = 7.12.33 [24 August 2019] =
231
  * [Bugfix] "Trigger social login in the same browser tab" option was not working when "Load all Javascript files in single file" was enabled at General Options page
232
  * [Improvement] Email share is being triggered in the new browser tab instead of the same tab
233
  * [Improvement] New user notification email is using WooCommerce new user email template instead of the default new user email template of WordPress, if WooCommerce is active
@@ -1953,7 +1962,7 @@ Yes, we can help you with it. Just drop an email at support[ at ]heateor[ dot ]c
1953
  * [Bugfix] Social share icons were not working with standard and transitional AMP modes
1954
  * [New] Added option to specify link to terms-conditions page in the GDPR opt-in text for social login
1955
 
1956
- = 7.12.33 [24 August 2019] =
1957
  * [Bugfix] "Trigger social login in the same browser tab" option was not working when "Load all Javascript files in single file" was enabled at General Options page
1958
  * [Improvement] Email share is being triggered in the new browser tab instead of the same tab
1959
  * [Improvement] New user notification email is using WooCommerce new user email template instead of the default new user email template of WordPress, if WooCommerce is active
@@ -1961,18 +1970,27 @@ Yes, we can help you with it. Just drop an email at support[ at ]heateor[ dot ]c
1961
  * [Improvement] Updated background of Instagram button to the multicolored one
1962
  * [Improvement] Admin UI improvement
1963
 
1964
- = 7.12.34 [30 August 2019] =
1965
  * [Bugfix] Using Twitch API v5 instead of v3, as it's going to shutdown
1966
  * [Improvement] Twitch login is now saving users' email address too along with other profile details
1967
  * [Improvement] Admin UI improvement
1968
 
1969
- = 7.12.35 [25 September 2019] =
1970
  * [Bugfix] Twitch login stopped working
1971
  * [Security fix] Twitch login was not checking if user's email has been verified on Twitch
1972
 
1973
- = 7.12.36 [16 October 2019] =
1974
  * [Bugfix] Querystring Parameters in the url of webpage were resetting the Facebook Like and Facebook Recommend counts to zero
1975
  * [Bugfix] Admin was not receiving new user notification email with Woocommerce active
1976
 
1977
- = 7.12.37 [17 October 2019] =
1978
- * [Improvement] Updated Facebook API to version 3.2 from version 2.10
 
 
 
 
 
 
 
 
 
1
  === WordPress Social Share, Social Login and Social Comments Plugin - Super Socializer ===
2
  Contributors: Heateor, farhan8heateor, jatin8heateor, the_champ, Hungarian Translator: László Tavaszi http://kerekmese.hu, Chinese Translator: CalmSmile calmsmile.org, Portuguese Translator: Paulo Purkyt https://www.linkedin.com/in/ppurkyt, Italian Translator: FG3D (Freedom's Gate) https://fg3d.net, Spanish translator: Ignacio Iglesias http://trespies.com, Arabic Translator: http://www.ArabsSM.com, Russian/Ukrainian Translator: Nicholas Lagunov
3
  Donate link: https://www.heateor.com/donate?action=Super+Socializer
4
+ Tags: social login, social share, social commenting, social comments, social plugin, profile data, social analytics, online identity, social profile storage, single sign-on, social media follow, facebook login
5
  Requires at least: 2.5.0
6
+ Tested up to: 5.3.2
7
+ Stable tag: 7.12.38
8
  License: GPLv2 or later
9
 
10
  The unique Social Plugin to let you integrate Social Login, Social Share, Social Comments and Social Media follow at your website
42
  * Mobile responsive sharing interface
43
  * Compatible with AMP
44
  * Enable/Disable vertical/floating sharing interface on mobile device
45
+ * Social Login from 7 Social Networks - Facebook, Google, Linkedin, Twitter, Vkontakte, Instagram and Steam
46
  * Enable Social Login interface at WordPress Login, Register pages and comment form
47
  * Syncs user's basic social profile data with WordPress profile
48
  * Enable Social Login at WooCommerce checkout page and customer login form
211
  8. **Social Commenting**: Disqus Commenting selected
212
 
213
  == Changelog ==
214
+ = 7.12.38 [14 February 2020] =
215
+ * [Security] Temporarily removed LiveJournal from social login networks due to an authentication bypass vulnerability
216
+ * [Improvement] Updated Twitter Auth library to latest version
217
+ * [Improvement] Updated Vkontakte API to latest version 5.103
218
+ * [Improvement] Updated Google Auth library to latest version
219
+ * [Improvement] Performance improvement
220
+ * Removed Xing from social login networks
221
+ * Removed Twitch from social login networks temporarily because the TwitchAuth 3rd party library being used is no longer maintained
222
+
223
+ = 7.12.37 [1 January 2020] =
224
  * [Improvement] Updated Facebook API to version 3.2 from version 2.10
225
 
226
+ = 7.12.36 [16 December 2019] =
227
  * [Bugfix] Querystring Parameters in the url of webpage were resetting the Facebook Like and Facebook Recommend counts to zero
228
  * [Bugfix] Admin was not receiving new user notification email with Woocommerce active
229
 
230
+ = 7.12.35 [25 November 2019] =
231
  * [Bugfix] Twitch login stopped working
232
  * [Security fix] Twitch login was not checking if user's email has been verified on Twitch
233
 
234
+ = 7.12.34 [30 October 2019] =
235
  * [Bugfix] Using Twitch API v5 instead of v3, as it's going to shutdown
236
  * [Improvement] Twitch login is now saving users' email address too along with other profile details
237
  * [Improvement] Admin UI improvement
238
 
239
+ = 7.12.33 [24 September 2019] =
240
  * [Bugfix] "Trigger social login in the same browser tab" option was not working when "Load all Javascript files in single file" was enabled at General Options page
241
  * [Improvement] Email share is being triggered in the new browser tab instead of the same tab
242
  * [Improvement] New user notification email is using WooCommerce new user email template instead of the default new user email template of WordPress, if WooCommerce is active
1962
  * [Bugfix] Social share icons were not working with standard and transitional AMP modes
1963
  * [New] Added option to specify link to terms-conditions page in the GDPR opt-in text for social login
1964
 
1965
+ = 7.12.33 [24 September 2019] =
1966
  * [Bugfix] "Trigger social login in the same browser tab" option was not working when "Load all Javascript files in single file" was enabled at General Options page
1967
  * [Improvement] Email share is being triggered in the new browser tab instead of the same tab
1968
  * [Improvement] New user notification email is using WooCommerce new user email template instead of the default new user email template of WordPress, if WooCommerce is active
1970
  * [Improvement] Updated background of Instagram button to the multicolored one
1971
  * [Improvement] Admin UI improvement
1972
 
1973
+ = 7.12.34 [30 October 2019] =
1974
  * [Bugfix] Using Twitch API v5 instead of v3, as it's going to shutdown
1975
  * [Improvement] Twitch login is now saving users' email address too along with other profile details
1976
  * [Improvement] Admin UI improvement
1977
 
1978
+ = 7.12.35 [25 November 2019] =
1979
  * [Bugfix] Twitch login stopped working
1980
  * [Security fix] Twitch login was not checking if user's email has been verified on Twitch
1981
 
1982
+ = 7.12.36 [16 December 2019] =
1983
  * [Bugfix] Querystring Parameters in the url of webpage were resetting the Facebook Like and Facebook Recommend counts to zero
1984
  * [Bugfix] Admin was not receiving new user notification email with Woocommerce active
1985
 
1986
+ = 7.12.37 [1 January 2019] =
1987
+ * [Improvement] Updated Facebook API to version 3.2 from version 2.10
1988
+
1989
+ = 7.12.38 [14 February 2020] =
1990
+ * [Security] Temporarily removed LiveJournal from social login networks due to an authentication bypass vulnerability
1991
+ * [Improvement] Updated Twitter Auth library to latest version
1992
+ * [Improvement] Updated Vkontakte API to latest version 5.103
1993
+ * [Improvement] Updated Google Auth library to latest version
1994
+ * [Improvement] Performance improvement
1995
+ * Removed Xing from social login networks
1996
+ * Removed Twitch from social login networks temporarily because the TwitchAuth 3rd party library being used is no longer maintained
super_socializer.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Super Socializer
4
  Plugin URI: https://super-socializer-wordpress.heateor.com
5
  Description: A complete 360 degree solution to provide all the social features like Social Login, Social Commenting, Social Sharing, Social Media follow and more
6
- Version: 7.12.37
7
  Author: Team Heateor
8
  Author URI: https://www.heateor.com
9
  Text Domain: super-socializer
@@ -11,19 +11,24 @@ Domain Path: /languages
11
  License: GPL2+
12
  */
13
  defined('ABSPATH') or die("Cheating........Uh!!");
14
- define('THE_CHAMP_SS_VERSION', '7.12.37');
15
 
16
  require 'helper.php';
17
 
18
  $theChampLoginOptions = get_option('the_champ_login');
19
  if(the_champ_social_login_enabled()){
20
  if(isset($theChampLoginOptions['providers']) && in_array('twitter', $theChampLoginOptions['providers'])){
21
- require 'library/twitteroauth.php';
22
- }
23
- if(isset($theChampLoginOptions['providers']) && in_array('xing', $theChampLoginOptions['providers'])){
24
- $theChampOauthConfigurationFile = plugins_url('library/oauth_configuration.json', __FILE__);
25
- require 'library/http.php';
26
- require 'library/oauth_client.php';
 
 
 
 
 
27
  }
28
  if(isset($theChampLoginOptions['providers']) && in_array('steam', $theChampLoginOptions['providers'])){
29
  require 'library/SteamLogin/SteamLogin.php';
@@ -205,61 +210,7 @@ function the_champ_connect(){
205
  }
206
  die;
207
  }
208
-
209
- // send request to Xing
210
- if((isset($_GET['SuperSocializerAuth']) && sanitize_text_field($_GET['SuperSocializerAuth']) == 'Xing')){
211
- if(function_exists('session_start')){
212
- session_start();
213
- }
214
- if(!isset($_GET['oauth_token']) && isset($_SESSION['OAUTH_ACCESS_TOKEN'])){
215
- Unset($_SESSION['OAUTH_ACCESS_TOKEN']);
216
- }
217
- if(isset($theChampLoginOptions['xing_ck']) && $theChampLoginOptions['xing_ck'] != '' && isset($theChampLoginOptions['xing_cs']) && $theChampLoginOptions['xing_cs'] != ''){
218
- $xingClient = new oauth_client_class;
219
- $xingClient->debug = 0;
220
- $xingClient->debug_http = 1;
221
- $xingClient->server = 'XING';
222
- $xingClient->redirect_uri = home_url() . '/index.php?SuperSocializerAuth=Xing&super_socializer_redirect_to=' . str_replace(array('http://', 'https://'), '', esc_url(urldecode(trim($_GET['super_socializer_redirect_to'])))) . (isset($_GET['heateorMSEnabled']) ? '&heateorMSEnabled=1' : '');
223
- $xingClient->client_id = $theChampLoginOptions['xing_ck'];
224
- $xingClient->client_secret = $theChampLoginOptions['xing_cs'];
225
- if(($success = $xingClient->Initialize())){
226
- if(($success = $xingClient->Process())){
227
- if(strlen($xingClient->access_token)){
228
- $success = $xingClient->CallAPI(
229
- 'https://api.xing.com/v1/users/me',
230
- 'GET', array(), array('FailOnAccessError'=>true), $xingResponse);
231
- }
232
- }
233
- $success = $xingClient->Finalize($success);
234
- }
235
- if($xingClient->exit) die('exit');
236
- if($success){
237
- if(isset($xingResponse -> users) && is_array($xingResponse -> users) && isset($xingResponse -> users[0] -> id)){
238
- $xingRedirect = the_champ_get_http() . esc_attr($_GET['super_socializer_redirect_to']);
239
- $profileData = the_champ_sanitize_profile_data($xingResponse -> users[0], 'xing');
240
- if(isset($_GET['heateorMSEnabled'])){
241
- $profileData['mc_subscribe'] = 1;
242
- }
243
- $response = the_champ_user_auth($profileData, 'xing', $xingRedirect);
244
- if(is_array($response) && isset($response['message']) && $response['message'] == 'register' && (!isset($response['url']) || $response['url'] == '')){
245
- $redirectTo = the_champ_get_login_redirection_url($xingRedirect, true);
246
- }elseif(isset($response['message']) && $response['message'] == 'linked'){
247
- $redirectTo = $xingRedirect . (strpos($xingRedirect, '?') !== false ? '&' : '?') . 'linked=1';
248
- }elseif(isset($response['message']) && $response['message'] == 'not linked'){
249
- $redirectTo = $xingRedirect . (strpos($xingRedirect, '?') !== false ? '&' : '?') . 'linked=0';
250
- }elseif(isset($response['url']) && $response['url'] != ''){
251
- $redirectTo = $response['url'];
252
- }else{
253
- $redirectTo = the_champ_get_login_redirection_url($xingRedirect);
254
- }
255
- the_champ_close_login_popup($redirectTo);
256
- }
257
- }else{
258
- echo 'Error:' . $xingClient->error;
259
- die;
260
- }
261
- }
262
- }
263
  if(isset($_GET['SuperSocializerAuth']) && sanitize_text_field($_GET['SuperSocializerAuth']) == 'Linkedin'){
264
  if(isset($theChampLoginOptions['li_key']) && $theChampLoginOptions['li_key'] != '' && isset($theChampLoginOptions['li_secret']) && $theChampLoginOptions['li_secret'] != ''){
265
  if(!isset($_GET['code']) && !isset($_GET['state'])){
@@ -353,45 +304,6 @@ function the_champ_connect(){
353
  }
354
  }
355
  }
356
- if(isset($_GET['SuperSocializerAuth']) && sanitize_text_field($_GET['SuperSocializerAuth']) == 'Twitch'){
357
- if(function_exists('session_start')){
358
- session_start();
359
- }
360
- require 'library/Twitch/twitch.php';
361
- $twitchAuth = new TwitchTV($theChampLoginOptions['twitch_client_id'], $theChampLoginOptions['twitch_client_secret'], home_url() . '/?SuperSocializerAuth=Twitch', array('user_read'));
362
- if(!isset($_GET['code'])){
363
- $_SESSION['super_socializer_twitch_redirect'] = isset($_GET['super_socializer_redirect_to']) ? esc_url(trim($_GET['super_socializer_redirect_to'])) : home_url();
364
- wp_redirect($twitchAuth->authenticate());
365
- die;
366
- }else{
367
- $accessToken = $twitchAuth->get_access_token($_GET['code']);
368
- $username = $twitchAuth->authenticated_user($accessToken);
369
- if(isset($username)){
370
- $profileData = $twitchAuth->get_userid($username, true, $accessToken);
371
- if(is_array($profileData) && isset($profileData['_id']) && isset($profileData['email_verified']) && $profileData['email_verified'] === true){
372
- $profileData = the_champ_sanitize_profile_data($profileData, 'twitch');
373
- if(isset($_GET['heateorMSEnabled'])){
374
- $profileData['mc_subscribe'] = 1;
375
- }
376
- $twitchRedirectUrl = isset($_SESSION['super_socializer_twitch_redirect']) && $_SESSION['super_socializer_twitch_redirect'] ? $_SESSION['super_socializer_twitch_redirect'] : home_url();
377
- unset($_SESSION['super_socializer_twitch_redirect']);
378
- $response = the_champ_user_auth($profileData, 'twitch', $twitchRedirectUrl);
379
- if(is_array($response) && isset($response['message']) && $response['message'] == 'register' && (!isset($response['url']) || $response['url'] == '')){
380
- $redirectTo = the_champ_get_login_redirection_url($twitchRedirectUrl, true);
381
- }elseif(isset($response['message']) && $response['message'] == 'linked'){
382
- $redirectTo = $twitchRedirectUrl . (strpos($twitchRedirectUrl, '?') !== false ? '&' : '?') . 'linked=1';
383
- }elseif(isset($response['message']) && $response['message'] == 'not linked'){
384
- $redirectTo = $twitchRedirectUrl . (strpos($twitchRedirectUrl, '?') !== false ? '&' : '?') . 'linked=0';
385
- }elseif(isset($response['url']) && $response['url'] != ''){
386
- $redirectTo = $response['url'];
387
- }else{
388
- $redirectTo = the_champ_get_login_redirection_url($twitchRedirectUrl);
389
- }
390
- the_champ_close_login_popup($redirectTo);
391
- }
392
- }
393
- }
394
- }
395
  if(isset($_GET['SuperSocializerAuth']) && sanitize_text_field($_GET['SuperSocializerAuth']) == 'Facebook'){
396
  if(isset($theChampLoginOptions['fb_key']) && $theChampLoginOptions['fb_key'] != '' && isset($theChampLoginOptions['fb_secret']) && $theChampLoginOptions['fb_secret'] != ''){
397
  if(function_exists('session_start')){
@@ -608,10 +520,11 @@ function the_champ_connect(){
608
  die;
609
  }
610
  /* Build TwitterOAuth object with client credentials. */
611
- $connection = new TwitterOAuth($theChampLoginOptions['twitter_key'], $theChampLoginOptions['twitter_secret']);
 
612
  /* Get temporary credentials. */
613
- $requestToken = $connection->getRequestToken(esc_url(home_url()));
614
- if($connection->http_code == 200){
615
  // generate unique ID
616
  $uniqueId = mt_rand();
617
  // save oauth token and secret in db temporarily
@@ -623,7 +536,7 @@ function the_champ_connect(){
623
  if(isset($_GET['super_socializer_redirect_to']) && heateor_ss_validate_url($_GET['super_socializer_redirect_to']) !== false){
624
  update_user_meta($uniqueId, 'thechamp_twitter_redirect', esc_url(trim($_GET['super_socializer_redirect_to'])));
625
  }
626
- wp_redirect($connection->getAuthorizeURL($requestToken['oauth_token']));
627
  die;
628
  }else{
629
  ?>
@@ -655,11 +568,11 @@ function the_champ_connect(){
655
  wp_redirect(esc_url(home_url()));
656
  die;
657
  }
658
- $connection = new TwitterOAuth($theChampLoginOptions['twitter_key'], $theChampLoginOptions['twitter_secret'], $_REQUEST['oauth_token'], $oauthTokenSecret);
659
  /* Request access tokens from twitter */
660
- $accessToken = $connection->getAccessToken($_REQUEST['oauth_verifier']);
661
  /* Create a TwitterOauth object with consumer/user tokens. */
662
- $connection = new TwitterOAuth($theChampLoginOptions['twitter_key'], $theChampLoginOptions['twitter_secret'], $accessToken['oauth_token'], $accessToken['oauth_token_secret']);
663
  $content = $connection->get('account/verify_credentials', array('include_email' => 'true'));
664
  // delete temporary data
665
  delete_user_meta($uniqueId, 'thechamp_twitter_oauthtokensecret');
@@ -686,88 +599,6 @@ function the_champ_connect(){
686
  the_champ_close_login_popup($redirectTo);
687
  }
688
  }
689
-
690
- // LiveJournal auth
691
- if(isset($_GET['SuperSocializerAuth']) && sanitize_text_field($_GET['SuperSocializerAuth']) == 'LiveJournal'){
692
- the_champ_livejournal_auth();
693
- }
694
- }
695
-
696
- /**
697
- * LiveJournal auth
698
- */
699
- function the_champ_livejournal_auth(){
700
- require('library/LiveJournalLogin/class.openid.v3.php');
701
- $currentPageUrl = the_champ_get_valid_url(html_entity_decode(esc_url(the_champ_get_http().$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"])));
702
- if(isset($_POST['openid_action']) && $_POST['openid_action'] == "SuperSocializerLogin"){ // Get identity from user and redirect browser to OpenID Server
703
- $theChampOpenId = new SimpleOpenID;
704
- $theChampOpenId->SetIdentity(sanitize_text_field($_POST['openid_url']).'.livejournal.com');
705
- $theChampOpenId->SetTrustRoot($currentPageUrl);
706
- $theChampOpenId->SetRequiredFields(array('email','fullname'));
707
- $theChampOpenId->SetOptionalFields(array('dob','gender','postcode','country','language','timezone'));
708
- if($theChampOpenId->GetOpenIDServer()){
709
- $theChampOpenId->SetApprovedURL($currentPageUrl); // Send Response from OpenID server to this script
710
- $theChampOpenId->Redirect(); // This will redirect user to OpenID Server
711
- }else{
712
- $error = $theChampOpenId->GetError();
713
- echo "ERROR CODE: " . $error['code'] . "<br/>";
714
- echo "ERROR DESCRIPTION: " . $error['description'] . "<br/>";
715
- }
716
- exit;
717
- }elseif(isset($_GET['openid_mode']) && $_GET['openid_mode'] == 'id_res'){ // Perform HTTP Request to OpenID server to validate key
718
- $theChampOpenId = new SimpleOpenID;
719
- $theChampOpenId->SetIdentity($_GET['openid_identity']);
720
- $theChampOpenIdValidationResult = $theChampOpenId->ValidateWithServer();
721
- if($theChampOpenIdValidationResult == true){ // OK HERE KEY IS VALID
722
- $userpicUrl = '';
723
- if(isset($_GET['openid_claimed_id']) && $_GET['openid_claimed_id'] != ''){
724
- $usernameParts = explode('.', str_replace('http://', '', sanitize_text_field($_GET['openid_claimed_id'])));
725
- $response = wp_remote_get( 'http://www.livejournal.com/allpics.bml?user=' . $usernameParts[0], array( 'timeout' => 15 ) );
726
- if( ! is_wp_error( $response ) && isset( $response['response']['code'] ) && 200 === $response['response']['code'] ){
727
- $body = wp_remote_retrieve_body( $response );
728
- if($body){
729
- $userpicsHtmlParts = explode('https://l-userpic.livejournal.com', $body);
730
- $userpicsId = explode("'", $userpicsHtmlParts[1]);
731
- $userpicUrl = 'https://l-userpic.livejournal.com' . $userpicsId[0];
732
- }
733
- }
734
- $profileData = array();
735
- $profileData['username'] = $usernameParts[0];
736
- $profileData['link'] = trim($_GET['openid_claimed_id']);
737
- $profileData['avatar'] = $userpicUrl;
738
- $profileData['name'] = $usernameParts[0];
739
- $profileData['first_name'] = $usernameParts[0];
740
- $profileData['last_name'] = $usernameParts[0];
741
- $redirection = isset($_GET['super_socializer_redirect_to']) && heateor_ss_validate_url($_GET['super_socializer_redirect_to']) !== false ? esc_url($_GET['super_socializer_redirect_to']) : '';
742
- $profileData = the_champ_sanitize_profile_data($profileData, 'liveJournal');
743
- if(isset($_GET['heateorMSEnabled'])){
744
- $profileData['mc_subscribe'] = 1;
745
- }
746
- $response = the_champ_user_auth($profileData, 'liveJournal', $redirection);
747
- if(is_array($response) && isset($response['message']) && $response['message'] == 'register' && (!isset($response['url']) || $response['url'] == '')){
748
- $redirectTo = the_champ_get_login_redirection_url($redirection, true);
749
- }elseif(isset($response['message']) && $response['message'] == 'linked'){
750
- $redirectTo = $redirection . (strpos($redirection, '?') !== false ? '&' : '?') . 'linked=1';
751
- }elseif(isset($response['message']) && $response['message'] == 'not linked'){
752
- $redirectTo = $redirection . (strpos($redirection, '?') !== false ? '&' : '?') . 'linked=0';
753
- }elseif(isset($response['url']) && $response['url'] != ''){
754
- $redirectTo = $response['url'];
755
- }else{
756
- $redirectTo = the_champ_get_login_redirection_url($redirection);
757
- }
758
- the_champ_close_login_popup($redirectTo);
759
- }
760
- }elseif($theChampOpenId->IsError() == true){ // Oops, WE GOT SOME ERROR
761
- $error = $theChampOpenId->GetError();
762
- echo "ERROR CODE: " . $error['code'] . "<br/>";
763
- echo "ERROR DESCRIPTION: " . $error['description'] . "<br/>";
764
- }else{ // Signature Verification Failed
765
- echo "INVALID AUTHORIZATION";
766
- }
767
- }elseif(isset($_GET['openid_mode']) && $_GET['openid_mode'] == 'cancel'){ // User Canceled the Request
768
- the_champ_close_login_popup($currentPageUrl);
769
- }
770
- die;
771
  }
772
 
773
  /**
@@ -811,13 +642,14 @@ function the_champ_get_http(){
811
  */
812
  function the_champ_get_valid_url($url){
813
  $decodedUrl = urldecode($url);
814
- if(html_entity_decode(esc_url(remove_query_arg(array('ss_message', 'SuperSocializerVerified', 'SuperSocializerUnverified'), $decodedUrl))) == wp_login_url() || $decodedUrl == home_url().'/wp-login.php?action=register' || $decodedUrl == home_url().'/wp-login.php?loggedout=true'){
815
  $url = esc_url(home_url()).'/';
816
  }elseif(isset($_GET['redirect_to'])){
817
- if(urldecode($_GET['redirect_to']) == admin_url()){
 
818
  $url = esc_url(home_url()).'/';
819
- }elseif(the_champ_validate_url(urldecode($_GET['redirect_to'])) && (strpos(urldecode($_GET['redirect_to']), 'http://') !== false || strpos(urldecode($_GET['redirect_to']), 'https://') !== false)){
820
- $url = $_GET['redirect_to'];
821
  }else{
822
  $url = esc_url(home_url()).'/';
823
  }
@@ -928,9 +760,8 @@ function the_champ_frontend_scripts(){
928
  global $theChampSteamLogin;
929
  $twitterRedirect = urlencode(the_champ_get_valid_url(html_entity_decode(esc_url(the_champ_get_http().$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]))));
930
  $currentPageUrl = urldecode($twitterRedirect);
931
- $theChampLJAuthUrl = remove_query_arg('action', the_champ_get_valid_url($currentPageUrl));
932
  ?>
933
- <script> var theChampFBKey = '<?php echo $fbKey ?>', theChampSameTabLogin = '<?php echo isset($theChampLoginOptions["same_tab_login"]) ? 1 : 0; ?>', theChampVerified = <?php echo intval($userVerified) ?>; var theChampAjaxUrl = '<?php echo html_entity_decode(admin_url().$ajaxUrl) ?>'; var theChampPopupTitle = '<?php echo $notification; ?>'; var theChampEmailPopup = <?php echo intval($emailPopup); ?>; var theChampEmailAjaxUrl = '<?php echo html_entity_decode(admin_url().$emailAjaxUrl); ?>'; var theChampEmailPopupTitle = '<?php echo $emailPopupTitle; ?>'; var theChampEmailPopupErrorMsg = '<?php echo htmlspecialchars($emailPopupErrorMessage, ENT_QUOTES); ?>'; var theChampEmailPopupUniqueId = '<?php echo $emailPopupUniqueId; ?>'; var theChampEmailPopupVerifyMessage = '<?php echo $emailPopupVerifyMessage; ?>'; var theChampLJLoginUsernameString = '<?php echo htmlspecialchars(__('Enter your LiveJournal username', 'super-socializer'), ENT_QUOTES); ?>'; var theChampLJAuthUrl = '<?php echo $theChampLJAuthUrl . (strpos($theChampLJAuthUrl, '?') !== false ? '&' : '?') . "SuperSocializerAuth=LiveJournal"; ?>'; var theChampSteamAuthUrl = "<?php echo $theChampSteamLogin ? $theChampSteamLogin->url( esc_url(home_url()) . '?SuperSocializerSteamAuth=' . $twitterRedirect ) : ''; ?>"; var theChampTwitterRedirect = '<?php echo $twitterRedirect ?>'; <?php echo isset($theChampLoginOptions['disable_reg']) && isset($theChampLoginOptions['disable_reg_redirect']) && $theChampLoginOptions['disable_reg_redirect'] != '' ? 'var theChampDisableRegRedirect = "' . html_entity_decode(esc_url($theChampLoginOptions['disable_reg_redirect'])) . '";' : ''; ?> var heateorMSEnabled = 0; var theChampTwitterAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Twitter&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampFacebookAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Facebook&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampTwitchAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Twitch&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampGoogleAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Google&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampVkontakteAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Vkontakte&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampLinkedinAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Linkedin&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampXingAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Xing&super_socializer_redirect_to=" + theChampTwitterRedirect;</script>
934
  <?php
935
  if(!$combinedScript){
936
  wp_enqueue_script('the_champ_sl_common', plugins_url('js/front/social_login/common.js', __FILE__), array('jquery'), THE_CHAMP_SS_VERSION, $inFooter);
@@ -1730,13 +1561,6 @@ function the_champ_addon_update_notification(){
1730
  <p><?php _e('Update "Social Login myCRED Integration" add-on for maximum compatibility with current version of Super Socialzer', 'super-socializer') ?></p>
1731
  </div>
1732
  <?php
1733
- }elseif(defined('HEATEOR_SOCIAL_LOGIN_MYCRED_INTEGRATION_VERSION') && version_compare('1.2.7', HEATEOR_SOCIAL_LOGIN_MYCRED_INTEGRATION_VERSION) > 0){
1734
- ?>
1735
- <div class="error notice">
1736
- <h3>Social Login - myCRED Integration</h3>
1737
- <p><?php _e('Update "Social Login myCRED Integration" add-on for compatibility with LiveJournal Login of Super Socialzer', 'super-socializer') ?></p>
1738
- </div>
1739
- <?php
1740
  }
1741
 
1742
  $currentVersion = get_option('the_champ_ss_version');
@@ -1754,8 +1578,7 @@ function the_champ_addon_update_notification(){
1754
  (in_array('facebook', $theChampLoginOptions['providers']) && (!isset($theChampLoginOptions['fb_secret']) || $theChampLoginOptions['fb_secret'] == '')) ||
1755
  (in_array('linkedin', $theChampLoginOptions['providers']) && (!isset($theChampLoginOptions['li_secret']) || $theChampLoginOptions['li_secret'] == '') ) ||
1756
  (in_array('google', $theChampLoginOptions['providers']) && (!isset($theChampLoginOptions['google_secret']) || $theChampLoginOptions['google_secret'] == '')) ||
1757
- (in_array('vkontakte', $theChampLoginOptions['providers']) && (!isset($theChampLoginOptions['vk_secure_key']) || $theChampLoginOptions['vk_secure_key'] == '')) ||
1758
- (in_array('twitch', $theChampLoginOptions['providers']) && (!isset($theChampLoginOptions['twitch_client_secret']) || $theChampLoginOptions['twitch_client_secret'] == ''))
1759
  )
1760
  ){
1761
  ?>
3
  Plugin Name: Super Socializer
4
  Plugin URI: https://super-socializer-wordpress.heateor.com
5
  Description: A complete 360 degree solution to provide all the social features like Social Login, Social Commenting, Social Sharing, Social Media follow and more
6
+ Version: 7.12.38
7
  Author: Team Heateor
8
  Author URI: https://www.heateor.com
9
  Text Domain: super-socializer
11
  License: GPL2+
12
  */
13
  defined('ABSPATH') or die("Cheating........Uh!!");
14
+ define('THE_CHAMP_SS_VERSION', '7.12.38');
15
 
16
  require 'helper.php';
17
 
18
  $theChampLoginOptions = get_option('the_champ_login');
19
  if(the_champ_social_login_enabled()){
20
  if(isset($theChampLoginOptions['providers']) && in_array('twitter', $theChampLoginOptions['providers'])){
21
+ require 'library/Twitter/src/Config.php';
22
+ require 'library/Twitter/src/Response.php';
23
+ require 'library/Twitter/src/SignatureMethod.php';
24
+ require 'library/Twitter/src/HmacSha1.php';
25
+ require 'library/Twitter/src/Consumer.php';
26
+ require 'library/Twitter/src/Util.php';
27
+ require 'library/Twitter/src/Request.php';
28
+ require 'library/Twitter/src/TwitterOAuthException.php';
29
+ require 'library/Twitter/src/Token.php';
30
+ require 'library/Twitter/src/Util/JsonDecoder.php';
31
+ require 'library/Twitter/src/TwitterOAuth.php';
32
  }
33
  if(isset($theChampLoginOptions['providers']) && in_array('steam', $theChampLoginOptions['providers'])){
34
  require 'library/SteamLogin/SteamLogin.php';
210
  }
211
  die;
212
  }
213
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
214
  if(isset($_GET['SuperSocializerAuth']) && sanitize_text_field($_GET['SuperSocializerAuth']) == 'Linkedin'){
215
  if(isset($theChampLoginOptions['li_key']) && $theChampLoginOptions['li_key'] != '' && isset($theChampLoginOptions['li_secret']) && $theChampLoginOptions['li_secret'] != ''){
216
  if(!isset($_GET['code']) && !isset($_GET['state'])){
304
  }
305
  }
306
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
307
  if(isset($_GET['SuperSocializerAuth']) && sanitize_text_field($_GET['SuperSocializerAuth']) == 'Facebook'){
308
  if(isset($theChampLoginOptions['fb_key']) && $theChampLoginOptions['fb_key'] != '' && isset($theChampLoginOptions['fb_secret']) && $theChampLoginOptions['fb_secret'] != ''){
309
  if(function_exists('session_start')){
520
  die;
521
  }
522
  /* Build TwitterOAuth object with client credentials. */
523
+ $connection = new Abraham\TwitterOAuth\TwitterOAuth($theChampLoginOptions['twitter_key'], $theChampLoginOptions['twitter_secret']);
524
+ $requestToken = $connection->oauth('oauth/request_token', ['oauth_callback' => esc_url(home_url())]);
525
  /* Get temporary credentials. */
526
+ //$requestToken = $connection->getRequestToken(esc_url(home_url()));
527
+ if($connection->getLastHttpCode() == 200){
528
  // generate unique ID
529
  $uniqueId = mt_rand();
530
  // save oauth token and secret in db temporarily
536
  if(isset($_GET['super_socializer_redirect_to']) && heateor_ss_validate_url($_GET['super_socializer_redirect_to']) !== false){
537
  update_user_meta($uniqueId, 'thechamp_twitter_redirect', esc_url(trim($_GET['super_socializer_redirect_to'])));
538
  }
539
+ wp_redirect($connection->url('oauth/authorize', ['oauth_token' => $requestToken['oauth_token']]));
540
  die;
541
  }else{
542
  ?>
568
  wp_redirect(esc_url(home_url()));
569
  die;
570
  }
571
+ $connection = new Abraham\TwitterOAuth\TwitterOAuth($theChampLoginOptions['twitter_key'], $theChampLoginOptions['twitter_secret'], $_REQUEST['oauth_token'], $oauthTokenSecret);
572
  /* Request access tokens from twitter */
573
+ $accessToken = $connection->oauth("oauth/access_token", ["oauth_verifier" => $_REQUEST['oauth_verifier']]);
574
  /* Create a TwitterOauth object with consumer/user tokens. */
575
+ $connection = new Abraham\TwitterOAuth\TwitterOAuth($theChampLoginOptions['twitter_key'], $theChampLoginOptions['twitter_secret'], $accessToken['oauth_token'], $accessToken['oauth_token_secret']);
576
  $content = $connection->get('account/verify_credentials', array('include_email' => 'true'));
577
  // delete temporary data
578
  delete_user_meta($uniqueId, 'thechamp_twitter_oauthtokensecret');
599
  the_champ_close_login_popup($redirectTo);
600
  }
601
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
602
  }
603
 
604
  /**
642
  */
643
  function the_champ_get_valid_url($url){
644
  $decodedUrl = urldecode($url);
645
+ if(html_entity_decode(esc_url(remove_query_arg(array('ss_message', 'SuperSocializerVerified', 'SuperSocializerUnverified', 'wp_lang', 'loggedout'), $decodedUrl))) == wp_login_url() || $decodedUrl == home_url().'/wp-login.php?action=register'){
646
  $url = esc_url(home_url()).'/';
647
  }elseif(isset($_GET['redirect_to'])){
648
+ $redirect_to = esc_url($_GET['redirect_to']);
649
+ if(urldecode($redirect_to) == admin_url()){
650
  $url = esc_url(home_url()).'/';
651
+ }elseif(the_champ_validate_url(urldecode($redirect_to)) && (strpos(urldecode($redirect_to), 'http://') !== false || strpos(urldecode($redirect_to), 'https://') !== false)){
652
+ $url = $redirect_to;
653
  }else{
654
  $url = esc_url(home_url()).'/';
655
  }
760
  global $theChampSteamLogin;
761
  $twitterRedirect = urlencode(the_champ_get_valid_url(html_entity_decode(esc_url(the_champ_get_http().$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]))));
762
  $currentPageUrl = urldecode($twitterRedirect);
 
763
  ?>
764
+ <script> var theChampFBKey = '<?php echo $fbKey ?>', theChampSameTabLogin = '<?php echo isset($theChampLoginOptions["same_tab_login"]) ? 1 : 0; ?>', theChampVerified = <?php echo intval($userVerified) ?>; var theChampAjaxUrl = '<?php echo html_entity_decode(admin_url().$ajaxUrl) ?>'; var theChampPopupTitle = '<?php echo $notification; ?>'; var theChampEmailPopup = <?php echo intval($emailPopup); ?>; var theChampEmailAjaxUrl = '<?php echo html_entity_decode(admin_url().$emailAjaxUrl); ?>'; var theChampEmailPopupTitle = '<?php echo $emailPopupTitle; ?>'; var theChampEmailPopupErrorMsg = '<?php echo htmlspecialchars($emailPopupErrorMessage, ENT_QUOTES); ?>'; var theChampEmailPopupUniqueId = '<?php echo $emailPopupUniqueId; ?>'; var theChampEmailPopupVerifyMessage = '<?php echo $emailPopupVerifyMessage; ?>'; var theChampSteamAuthUrl = "<?php echo $theChampSteamLogin ? $theChampSteamLogin->url( esc_url(home_url()) . '?SuperSocializerSteamAuth=' . $twitterRedirect ) : ''; ?>"; var theChampTwitterRedirect = '<?php echo $twitterRedirect ?>'; <?php echo isset($theChampLoginOptions['disable_reg']) && isset($theChampLoginOptions['disable_reg_redirect']) && $theChampLoginOptions['disable_reg_redirect'] != '' ? 'var theChampDisableRegRedirect = "' . html_entity_decode(esc_url($theChampLoginOptions['disable_reg_redirect'])) . '";' : ''; ?> var heateorMSEnabled = 0; var theChampTwitterAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Twitter&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampFacebookAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Facebook&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampGoogleAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Google&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampVkontakteAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Vkontakte&super_socializer_redirect_to=" + theChampTwitterRedirect; var theChampLinkedinAuthUrl = theChampSiteUrl + "?SuperSocializerAuth=Linkedin&super_socializer_redirect_to=" + theChampTwitterRedirect;</script>
765
  <?php
766
  if(!$combinedScript){
767
  wp_enqueue_script('the_champ_sl_common', plugins_url('js/front/social_login/common.js', __FILE__), array('jquery'), THE_CHAMP_SS_VERSION, $inFooter);
1561
  <p><?php _e('Update "Social Login myCRED Integration" add-on for maximum compatibility with current version of Super Socialzer', 'super-socializer') ?></p>
1562
  </div>
1563
  <?php
 
 
 
 
 
 
 
1564
  }
1565
 
1566
  $currentVersion = get_option('the_champ_ss_version');
1578
  (in_array('facebook', $theChampLoginOptions['providers']) && (!isset($theChampLoginOptions['fb_secret']) || $theChampLoginOptions['fb_secret'] == '')) ||
1579
  (in_array('linkedin', $theChampLoginOptions['providers']) && (!isset($theChampLoginOptions['li_secret']) || $theChampLoginOptions['li_secret'] == '') ) ||
1580
  (in_array('google', $theChampLoginOptions['providers']) && (!isset($theChampLoginOptions['google_secret']) || $theChampLoginOptions['google_secret'] == '')) ||
1581
+ (in_array('vkontakte', $theChampLoginOptions['providers']) && (!isset($theChampLoginOptions['vk_secure_key']) || $theChampLoginOptions['vk_secure_key'] == ''))
 
1582
  )
1583
  ){
1584
  ?>