diff --git a/README.md b/README.md index feffa06..ec1a2b0 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,39 @@ -# Eden PHP Library -##Designed for rapid prototyping, with less code. - -Eden is purely a library packed with core concepts and web services. You can use Eden on top of any CMS or framework you choose. At Openovate Labs, we use Eden for all of our internal products which in turn keeps Eden updated, evolving and constantly expanding. Eden takes advantage of PHP 5.3 with the tools available to get products made faster. Eden works with major players including: - -* Google -* Facebook -* Twitter -* Tumblr -* Four Square -* Get Satisfaction -* Eventbrite -* Zappos -* Web Charge -* Paypal -* Authorize.net -* Amazon -* Jabber - -#Contibuting to Eden - -##Setting up your machine with the Eden repository and your fork - -1. Fork the main Eden repository (https://github.com/Openovate/eden) -2. Fire up your local terminal and clone the *MAIN EDEN REPOSITORY* (git clone git://github.com/Openovate/eden.git) -3. Add your *FORKED EDEN REPOSITORY* as a remote (git remote add fork git@github.com:*github_username*/eden.git) - -##Making pull requests - -1. Before anything, make sure to update the *MAIN EDEN REPOSITORY*. (git checkout master; git pull origin master) -2. Once updated with the latest code, create a new branch with a branch name describing what your changes are (git checkout -b bugfix/fix-twitter-auth) - Possible types: - - bugfix - - feature - - improvement -3. Make your code changes. Always make sure to sign-off (-s) on all commits made (git commit -s -m "Commit message") -4. Once you've committed all the code to this branch, push the branch to your *FORKED EDEN REPOSITORY* (git push fork bugfix/fix-twitter-auth) -5. Go back to your *FORKED EDEN REPOSITORY* on GitHub and submit a pull request. -6. An Eden developer will review your code and merge it in when it has been classified as suitable. +# Eden PHP Library +##Designed for rapid prototyping, with less code. + +Eden is purely a library packed with core concepts and web services. You can use Eden on top of any CMS or framework you choose. At Openovate Labs, we use Eden for all of our internal products which in turn keeps Eden updated, evolving and constantly expanding. Eden takes advantage of PHP 5.3 with the tools available to get products made faster. Eden works with major players including: + +* Google +* Facebook +* Twitter +* Tumblr +* Four Square +* Get Satisfaction +* Eventbrite +* Zappos +* Web Charge +* Paypal +* Authorize.net +* Amazon +* Jabber + +#Contibuting to Eden + +##Setting up your machine with the Eden repository and your fork + +1. Fork the main Eden repository (https://github.com/Openovate/eden) +2. Fire up your local terminal and clone the *MAIN EDEN REPOSITORY* (git clone git://github.com/Openovate/eden.git) +3. Add your *FORKED EDEN REPOSITORY* as a remote (git remote add fork git@github.com:*github_username*/eden.git) + +##Making pull requests + +1. Before anything, make sure to update the *MAIN EDEN REPOSITORY*. (git checkout master; git pull origin master) +2. Once updated with the latest code, create a new branch with a branch name describing what your changes are (git checkout -b bugfix/fix-twitter-auth) + Possible types: + - bugfix + - feature + - improvement +3. Make your code changes. Always make sure to sign-off (-s) on all commits made (git commit -s -m "Commit message") +4. Once you've committed all the code to this branch, push the branch to your *FORKED EDEN REPOSITORY* (git push fork bugfix/fix-twitter-auth) +5. Go back to your *FORKED EDEN REPOSITORY* on GitHub and submit a pull request. +6. An Eden developer will review your code and merge it in when it has been classified as suitable. diff --git a/library/eden.php b/library/eden.php index 7d2d744..dd38da8 100644 --- a/library/eden.php +++ b/library/eden.php @@ -1,284 +1,284 @@ - -/* - * This file is part of the Eden package. - * (c) 2009-2011 Christian Blanquera - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/eden/event.php'; - -/** - * The starting point of every framework call. - * - * @author Christian Blanquera cblanquera@openovate.com - */ -function eden() { - $class = Eden::i(); - if(func_num_args() == 0) { - return $class; - } - - $args = func_get_args(); - return $class->__invoke($args); -} - -/** - * Defines the starting point of every framework call. - * Starts laying out how classes and methods are handled. - * - * @package Eden - * @category framework - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden extends Eden_Event { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_root = NULL; - protected static $_active = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - public function __construct() { - if(!self::$_active) { - self::$_active = $this; - } - - $this->_root = dirname(__FILE__); - } - - public function __call($name, $args) { - //first try to call the parent call - try { - return parent::__call($name, $args); - //this means something in the route went wrong - } catch(Eden_Route_Exception $e) { - //now try to call parent with the eden prefix - return parent::__call('Eden_'.$name, $args); - } - } - - /* Public Methods - -------------------------------*/ - /** - * Sets the root path - * - * @param string - * @return this - */ - public function setRoot($root) { - Eden_Error::i()->argument(1, 'string'); - - if(!class_exists('Eden_Path')) { - Eden_Loader::i()->load('Eden_Path'); - } - - $this->_root = (string) Eden_Path::i($root); - - return $this; - } - - /** - * Returns the root path - * - * @return string - */ - public function getRoot() { - return $this->_root; - } - - /** - * Get Active Application - * - * @return Eden - */ - public function getActiveApp() { - return self::$_active; - } - - /** - * Sets up Autoloading - * - * @param string|array path - * @return this - */ - public function setLoader() { - if(!class_exists('Eden_Loader')) { - //require autoload - require_once dirname(__FILE__).'/eden/loader.php'; - } - - //set autoload class as the autoload handler - spl_autoload_register(array(Eden_Loader::i(), 'handler')); - - //we need Eden_Path to fix the path formatting - if(!class_exists('Eden_Path')) { - Eden_Loader::i()->addRoot(dirname(__FILE__))->load('Eden_Path'); - } - - //get paths - $paths = func_get_args(); - - //if no paths - if(empty($paths)) { - //do nothing more - return $this; - } - - //no dupes - $paths = array_unique($paths); - - //for each path - foreach($paths as $i => $path) { - if(!is_string($path) && !is_null($path)) { - continue; - } - - if($path) { - //format the path - $path = (string) Eden_Path::i($path); - } else { - $path = $this->_root; - } - - //if path is not a real path - if(!is_dir($path)) { - //append the root - $path = $this->_root.$path; - } - - //if the path is still a real path - if(is_dir($path)) { - //add the root - Eden_Loader::i()->addRoot($path); - } - } - - return $this; - } - - /** - * Sets class routes - * - * @param string|array routes - * @return Eden_Framework - */ - public function routeClasses($routes) { - Eden_Error::i()->argument(1, 'string', 'array', 'bool'); - $route = Eden_Route::i()->getClass(); - - if($routes === true) { - $route->route('Cache', 'Eden_Cache') - ->route('Registry', 'Eden_Registry') - ->route('Model', 'Eden_Model') - ->route('Collection', 'Eden_Collection') - ->route('Cookie', 'Eden_Cookie') - ->route('Session', 'Eden_Session') - ->route('Template', 'Eden_Template') - ->route('Curl', 'Eden_Curl') - ->route('Event', 'Eden_Event') - ->route('Path', 'Eden_Path') - ->route('File', 'Eden_File') - ->route('Folder', 'Eden_Folder') - ->route('Image', 'Eden_Image') - ->route('Mysql', 'Eden_Mysql') - ->route('Type', 'Eden_Type'); - - return $this; - } - - if(is_string($routes)) { - $routes = include($routes); - } - - foreach($routes as $alias => $class) { - $route->route($alias, $class); - } - - return $this; - } - - /** - * Sets method routes - * - * @param string|array routes - * @return Eden_Framework - */ - public function routeMethods($routes) { - Eden_Error::i()->argument(1, 'string', 'array', 'bool'); - $route = Eden_Route::i()->getMethod(); - - if(is_bool($routes)) { - $route->route(NULL, 'output', 'Eden_Debug'); - return $this; - } - - if(is_string($routes)) { - $routes = include($routes); - } - - //walk the routes - foreach($routes as $method => $routePath) { - //if the path is a string - if(is_string($routePath)) { - //turn it into an array - $routePath = array($routePath); - } - - //if the path is an array and it's not empty - if(is_array($routePath) && !empty($routePath)) { - //if the size is 1 - if(count($routePath) == 1) { - //they mean the methods have the same name - $routePath[] = $method; - } - - //route the method - $route->route($method, $routePath[0], $routePath[1]); - } - } - - return $this; - } - - /** - * Starts a session - * - * @return this - */ - public function startSession() { - //get the session class - Eden_Session::i()->start(); - - return $this; - } - - /** - * Sets the PHP timezone - * - * @return this - */ - public function setTimezone($zone) { - Eden_Error::i()->argument(1, 'string'); - - date_default_timezone_set($zone); - - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2009-2011 Christian Blanquera + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/eden/event.php'; + +/** + * The starting point of every framework call. + * + * @author Christian Blanquera cblanquera@openovate.com + */ +function eden() { + $class = Eden::i(); + if(func_num_args() == 0) { + return $class; + } + + $args = func_get_args(); + return $class->__invoke($args); +} + +/** + * Defines the starting point of every framework call. + * Starts laying out how classes and methods are handled. + * + * @package Eden + * @category framework + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden extends Eden_Event { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_root = NULL; + protected static $_active = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + public function __construct() { + if(!self::$_active) { + self::$_active = $this; + } + + $this->_root = dirname(__FILE__); + } + + public function __call($name, $args) { + //first try to call the parent call + try { + return parent::__call($name, $args); + //this means something in the route went wrong + } catch(Eden_Route_Exception $e) { + //now try to call parent with the eden prefix + return parent::__call('Eden_'.$name, $args); + } + } + + /* Public Methods + -------------------------------*/ + /** + * Sets the root path + * + * @param string + * @return this + */ + public function setRoot($root) { + Eden_Error::i()->argument(1, 'string'); + + if(!class_exists('Eden_Path')) { + Eden_Loader::i()->load('Eden_Path'); + } + + $this->_root = (string) Eden_Path::i($root); + + return $this; + } + + /** + * Returns the root path + * + * @return string + */ + public function getRoot() { + return $this->_root; + } + + /** + * Get Active Application + * + * @return Eden + */ + public function getActiveApp() { + return self::$_active; + } + + /** + * Sets up Autoloading + * + * @param string|array path + * @return this + */ + public function setLoader() { + if(!class_exists('Eden_Loader')) { + //require autoload + require_once dirname(__FILE__).'/eden/loader.php'; + } + + //set autoload class as the autoload handler + spl_autoload_register(array(Eden_Loader::i(), 'handler')); + + //we need Eden_Path to fix the path formatting + if(!class_exists('Eden_Path')) { + Eden_Loader::i()->addRoot(dirname(__FILE__))->load('Eden_Path'); + } + + //get paths + $paths = func_get_args(); + + //if no paths + if(empty($paths)) { + //do nothing more + return $this; + } + + //no dupes + $paths = array_unique($paths); + + //for each path + foreach($paths as $i => $path) { + if(!is_string($path) && !is_null($path)) { + continue; + } + + if($path) { + //format the path + $path = (string) Eden_Path::i($path); + } else { + $path = $this->_root; + } + + //if path is not a real path + if(!is_dir($path)) { + //append the root + $path = $this->_root.$path; + } + + //if the path is still a real path + if(is_dir($path)) { + //add the root + Eden_Loader::i()->addRoot($path); + } + } + + return $this; + } + + /** + * Sets class routes + * + * @param string|array routes + * @return Eden_Framework + */ + public function routeClasses($routes) { + Eden_Error::i()->argument(1, 'string', 'array', 'bool'); + $route = Eden_Route::i()->getClass(); + + if($routes === true) { + $route->route('Cache', 'Eden_Cache') + ->route('Registry', 'Eden_Registry') + ->route('Model', 'Eden_Model') + ->route('Collection', 'Eden_Collection') + ->route('Cookie', 'Eden_Cookie') + ->route('Session', 'Eden_Session') + ->route('Template', 'Eden_Template') + ->route('Curl', 'Eden_Curl') + ->route('Event', 'Eden_Event') + ->route('Path', 'Eden_Path') + ->route('File', 'Eden_File') + ->route('Folder', 'Eden_Folder') + ->route('Image', 'Eden_Image') + ->route('Mysql', 'Eden_Mysql') + ->route('Type', 'Eden_Type'); + + return $this; + } + + if(is_string($routes)) { + $routes = include($routes); + } + + foreach($routes as $alias => $class) { + $route->route($alias, $class); + } + + return $this; + } + + /** + * Sets method routes + * + * @param string|array routes + * @return Eden_Framework + */ + public function routeMethods($routes) { + Eden_Error::i()->argument(1, 'string', 'array', 'bool'); + $route = Eden_Route::i()->getMethod(); + + if(is_bool($routes)) { + $route->route(NULL, 'output', 'Eden_Debug'); + return $this; + } + + if(is_string($routes)) { + $routes = include($routes); + } + + //walk the routes + foreach($routes as $method => $routePath) { + //if the path is a string + if(is_string($routePath)) { + //turn it into an array + $routePath = array($routePath); + } + + //if the path is an array and it's not empty + if(is_array($routePath) && !empty($routePath)) { + //if the size is 1 + if(count($routePath) == 1) { + //they mean the methods have the same name + $routePath[] = $method; + } + + //route the method + $route->route($method, $routePath[0], $routePath[1]); + } + } + + return $this; + } + + /** + * Starts a session + * + * @return this + */ + public function startSession() { + //get the session class + Eden_Session::i()->start(); + + return $this; + } + + /** + * Sets the PHP timezone + * + * @return this + */ + public function setTimezone($zone) { + Eden_Error::i()->argument(1, 'string'); + + date_default_timezone_set($zone); + + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/LICENSE.txt b/library/eden/LICENSE.txt index da712da..c84a40b 100644 --- a/library/eden/LICENSE.txt +++ b/library/eden/LICENSE.txt @@ -1,15 +1,15 @@ -Eden PHP Library -Copyright (C) 2012-2013 Christian Blanquera, Openovate Labs - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License +Eden PHP Library +Copyright (C) 2012-2013 Christian Blanquera, Openovate Labs + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. \ No newline at end of file diff --git a/library/eden/amazon/ecs.php b/library/eden/amazon/ecs.php index 473e02c..7eba0b1 100644 --- a/library/eden/amazon/ecs.php +++ b/library/eden/amazon/ecs.php @@ -1,190 +1,190 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Amazon S3 - * - * @package Eden - * @category amazon - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Amazon_Ecs extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_publicKey = NULL; - protected $_privateKey = NULL; - protected $_host = 'ecs.amazonaws.'; - protected $_uri = '/onca/xml'; - protected $_params = array(); - protected $_method = 'GET'; - protected $_canonicalizedQuery = NULL; - protected $_stringToSign = NULL; - protected $_signature = NULL; - protected $_requestUrl = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($privateKey, $publicKey) { - Eden_Amazon_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $this->_privateKey = $privateKey; - $this->_publicKey = $publicKey; - } - - /* Public Methods - -------------------------------*/ - public function setAssociateTag($tag) { - Eden_Amazon_Error::i()->argument(1, 'string'); - $this->_params['AssociateTag'] = $tag; - - return $this; - } - - public function setCountry($country = 'com') { - Eden_Amazon_Error::i()->argument(1, 'string'); - $this->_host = $this->_host.$country; - - return $this; - } - - public function setIdType($type) { - Eden_Amazon_Error::i()->argument(1, 'string'); - $this->_params['IdType'] = $type; - - return $this; - } - - public function setItemId($id) { - Eden_Amazon_Error::i()->argument(1, 'string', 'int'); - $this->_params['ItemId'] = $id; - - return $this; - } - - public function setKeyword($keyword) { - Eden_Amazon_Error::i()->argument(1, 'string', 'int'); - $this->_params['Keywords'] = $keyword; - - return $this; - } - - public function setMethod($method) { - Eden_Amazon_Error::i()->argument(1, 'string'); - $this->_method = $method; - - return $this; - } - - public function setOperation($operation) { - Eden_Amazon_Error::i()->argument(1, 'string'); - $this->_params['Operation'] = $operation; - - return $this; - } - - public function setPage($page = 1) { - Eden_Amazon_Error::i()->argument(1, 'int'); - $this->_params['ItemPage'] = $page; - - return $this; - } - - public function getResponse() { - $this->_params['AWSAccessKeyId'] = $this->_publicKey; - - ksort($this->_params); - $canonicalizedQuery = array(); - foreach ($this->_params as $param => $value) { - $param = str_replace("%7E", "~", rawurlencode($param)); - $value = str_replace("%7E", "~", rawurlencode($value)); - $canonicalizedQuery[] = $param."=".$value; - } - - $this->_canonicalizedQuery = implode("&", $canonicalizedQuery); - $this->_stringToSign = $this->_method."\n".$this->_host."\n".$this->_uri."\n".$this->_canonicalizedQuery; - $this->_setSignature(); - $this->_requestUrl = 'http://'.$this->_host.$this->_uri.'?'.$this->_canonicalizedQuery.'&Signature='.$this->_signature; - return $this->_sendRequest(); - } - - public function setResponseGroup($group) { - Eden_Amazon_Error::i()->argument(1, 'string'); - $this->_params['ResponseGroup'] = $group; - - return $this; - } - - public function setSearchIndex($index = 'All') { - Eden_Amazon_Error::i()->argument(1, 'string'); - $this->_params['SearchIndex'] = $index; - - return $this; - } - - public function setService($service) { - Eden_Amazon_Error::i()->argument(1, 'string'); - $this->_params['Service'] = $service; - - return $this; - } - - public function setTimestamp($time = NULL) { - Eden_Amazon_Error::i()->argument(1, 'string', 'int', 'null'); - if($time == NULL) { - $time = time(); - } - - if(is_string($time)) { - $time = strtotime($time); - } - - $this->_params['Timestamp'] = gmdate("Y-m-d\TH:i:s\Z", $time); - return $this; - } - - public function setVersion($version) { - Eden_Amazon_Error::i()->argument(1, 'string'); - $this->_params['Version'] = $version; - - return $this; - } - - /* Protected Methods - -------------------------------*/ - protected function _sendRequest() { - return Eden_Curl::i() - ->setUrl($this->_requestUrl) - ->verifyHost(false) - ->verifyPeer(false) - ->setTimeout(60) - ->getResponse(); - } - - protected function _setSignature() { - $this->_signature = base64_encode(hash_hmac("sha256", $this->_stringToSign, $this->_privateKey, True)); - $this->_signature = str_replace("%7E", "~", rawurlencode($this->_signature)); - - return $this; - } - - /* Private Methods - -------------------------------*/ -} + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Amazon S3 + * + * @package Eden + * @category amazon + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Amazon_Ecs extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_publicKey = NULL; + protected $_privateKey = NULL; + protected $_host = 'ecs.amazonaws.'; + protected $_uri = '/onca/xml'; + protected $_params = array(); + protected $_method = 'GET'; + protected $_canonicalizedQuery = NULL; + protected $_stringToSign = NULL; + protected $_signature = NULL; + protected $_requestUrl = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($privateKey, $publicKey) { + Eden_Amazon_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $this->_privateKey = $privateKey; + $this->_publicKey = $publicKey; + } + + /* Public Methods + -------------------------------*/ + public function setAssociateTag($tag) { + Eden_Amazon_Error::i()->argument(1, 'string'); + $this->_params['AssociateTag'] = $tag; + + return $this; + } + + public function setCountry($country = 'com') { + Eden_Amazon_Error::i()->argument(1, 'string'); + $this->_host = $this->_host.$country; + + return $this; + } + + public function setIdType($type) { + Eden_Amazon_Error::i()->argument(1, 'string'); + $this->_params['IdType'] = $type; + + return $this; + } + + public function setItemId($id) { + Eden_Amazon_Error::i()->argument(1, 'string', 'int'); + $this->_params['ItemId'] = $id; + + return $this; + } + + public function setKeyword($keyword) { + Eden_Amazon_Error::i()->argument(1, 'string', 'int'); + $this->_params['Keywords'] = $keyword; + + return $this; + } + + public function setMethod($method) { + Eden_Amazon_Error::i()->argument(1, 'string'); + $this->_method = $method; + + return $this; + } + + public function setOperation($operation) { + Eden_Amazon_Error::i()->argument(1, 'string'); + $this->_params['Operation'] = $operation; + + return $this; + } + + public function setPage($page = 1) { + Eden_Amazon_Error::i()->argument(1, 'int'); + $this->_params['ItemPage'] = $page; + + return $this; + } + + public function getResponse() { + $this->_params['AWSAccessKeyId'] = $this->_publicKey; + + ksort($this->_params); + $canonicalizedQuery = array(); + foreach ($this->_params as $param => $value) { + $param = str_replace("%7E", "~", rawurlencode($param)); + $value = str_replace("%7E", "~", rawurlencode($value)); + $canonicalizedQuery[] = $param."=".$value; + } + + $this->_canonicalizedQuery = implode("&", $canonicalizedQuery); + $this->_stringToSign = $this->_method."\n".$this->_host."\n".$this->_uri."\n".$this->_canonicalizedQuery; + $this->_setSignature(); + $this->_requestUrl = 'http://'.$this->_host.$this->_uri.'?'.$this->_canonicalizedQuery.'&Signature='.$this->_signature; + return $this->_sendRequest(); + } + + public function setResponseGroup($group) { + Eden_Amazon_Error::i()->argument(1, 'string'); + $this->_params['ResponseGroup'] = $group; + + return $this; + } + + public function setSearchIndex($index = 'All') { + Eden_Amazon_Error::i()->argument(1, 'string'); + $this->_params['SearchIndex'] = $index; + + return $this; + } + + public function setService($service) { + Eden_Amazon_Error::i()->argument(1, 'string'); + $this->_params['Service'] = $service; + + return $this; + } + + public function setTimestamp($time = NULL) { + Eden_Amazon_Error::i()->argument(1, 'string', 'int', 'null'); + if($time == NULL) { + $time = time(); + } + + if(is_string($time)) { + $time = strtotime($time); + } + + $this->_params['Timestamp'] = gmdate("Y-m-d\TH:i:s\Z", $time); + return $this; + } + + public function setVersion($version) { + Eden_Amazon_Error::i()->argument(1, 'string'); + $this->_params['Version'] = $version; + + return $this; + } + + /* Protected Methods + -------------------------------*/ + protected function _sendRequest() { + return Eden_Curl::i() + ->setUrl($this->_requestUrl) + ->verifyHost(false) + ->verifyPeer(false) + ->setTimeout(60) + ->getResponse(); + } + + protected function _setSignature() { + $this->_signature = base64_encode(hash_hmac("sha256", $this->_stringToSign, $this->_privateKey, True)); + $this->_signature = str_replace("%7E", "~", rawurlencode($this->_signature)); + + return $this; + } + + /* Private Methods + -------------------------------*/ +} diff --git a/library/eden/amazon/error.php b/library/eden/amazon/error.php index 6a8847d..9920d22 100644 --- a/library/eden/amazon/error.php +++ b/library/eden/amazon/error.php @@ -1,39 +1,39 @@ - -/* - * This file is part of the Eden package. - * (c) 2010-2012 Christian Blanquera - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Amazon Errors - * - * @package Eden - * @category amazon - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Amazon_Error extends Eden_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2010-2012 Christian Blanquera + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Amazon Errors + * + * @package Eden + * @category amazon + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Amazon_Error extends Eden_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/amazon/s3.php b/library/eden/amazon/s3.php index f09246e..b4dd823 100644 --- a/library/eden/amazon/s3.php +++ b/library/eden/amazon/s3.php @@ -1,898 +1,898 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Amazon S3 - * - * @package Eden - * @category amazon - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Amazon_S3 extends Eden_Class { - /* Constants - -------------------------------*/ - const ACL_PRIVATE = 'private'; - const ACL_PUBLIC_READ = 'public-read'; - const ACL_PUBLIC_READ_WRITE = 'public-read-write'; - const ACL_AUTHENTICATED_READ = 'authenticated-read'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_ssl = false; - protected $_host = 's3.amazonaws.com'; - protected $_user = NULL; - protected $_pass = NULL; - - protected $_meta = array(); - protected $_response = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($user, $pass, $host = 's3.amazonaws.com', $ssl = false) { - $this->_host = $host; - $this->_user = $user; - $this->_pass = $pass; - $this->_ssl = $ssl; - } - - /* Public Methods - -------------------------------*/ - /** - * Put a bucket - * - * @param string $bucket Bucket name - * @param constant $acl ACL flag - * @param string $location Set as "EU" to create buckets hosted in Europe - * @return boolean - */ - public function addBucket($bucket, $acl = self::ACL_PRIVATE, $location = false) { - //argument test - Eden_Amazon_Error::i() - ->argument(1, 'string') //Argument 1 must be string - ->argument(2, 'string', 'null') //Argument 2 must be string or null - ->argument(3, 'bool'); //Argument 3 must be bool - - $data = NULL; - $headers = array(); - $amazon = array('x-amz-acl' => $acl); - - if ($location !== false) { - $dom = new DOMDocument; - $config = $dom->createElement('CreateBucketConfiguration'); - $constraint = $dom->createElement('LocationConstraint', strtoupper($location)); - - $config->appendChild($constraint); - $dom->appendChild($config); - $data = $dom->saveXML(); - - $headers['Content-Type'] = 'application/xml'; - } - - $this->_setResponse('PUT', $bucket, '/', array(), $data, $headers, $amazon); - - if(!empty($this->_meta['error']) || empty($this->_response)) { - return false; - } - - return true; - } - - /** - * Put an object - * - * @param mixed $input Input data - * @param string $bucket Bucket name - * @param string $path Object URI - * @param constant $acl ACL constant - * @param array $metaHeaders Array of x-amz-meta-* headers - * @param array $requestHeaders Array of request headers or content type as a string - * @return boolean - */ - public function addFile($bucket, $path, $data, $acl = self::ACL_PRIVATE, $file = false) { - //argument test - Eden_Amazon_Error::i() - ->argument(1, 'string') //Argument 1 must be string - ->argument(2, 'string') //Argument 2 must be string - ->argument(4, 'string') //Argument 4 must be string - ->argument(5, 'bool'); //Argument 5 must be boolean - - $headers = $amazon = array(); - - $headers['Content-Type'] = Eden_File::i()->getMimeType($path); - $amazon['x-amz-acl'] = $acl; - - if(strpos($path, '/') !== 0) { - $path = '/'.$path; - } - - //if not file - if(!$file) { - //put it into a file - //we do this because file data in memory is bad - $tmp = tmpfile(); - fwrite($tmp, $data); - $file = $tmp; - $size = strlen($data); - //release file data from memory - $data = NULL; - //if is a file - } else { - $file = fopen($data, 'r'); - $size = filesize($data); - } - - $data = array($file, $size); - - $this->_setResponse('PUT', $bucket, $path, array(), $data, $headers, $amazon); - - //dont forget to close - fclose($file); - - if(!empty($this->_meta['error'])) { - return false; - } - - return $size; - } - - /** - * Delete an empty bucket - * - * @param string $bucket Bucket name - * @return boolean - */ - public function deleteBucket($bucket) { - //Argument 1 must be string - Eden_Amazon_Error::i()->argument(1, 'string'); - $this->_setResponse('DELETE', $bucket); - - if(!empty($this->_meta['error']) || empty($this->_response)) { - return false; - } - - return true; - } - - /** - * Delete an object - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @return boolean - */ - public function deleteFile($bucket, $path) { - //argument test - Eden_Amazon_Error::i() - ->argument(1, 'string') //Argument 1 must be string - ->argument(2, 'string'); //Argument 2 must be string - - $this->_setResponse('DELETE', $bucket, $path); - - if(!empty($this->_meta['error']) || empty($this->_response)) { - return false; - } - - return true; - } - - /** - * Delete an object - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @return boolean - */ - public function deleteFolder($bucket, $path) { - //argument test - Eden_Amazon_Error::i() - ->argument(1, 'string') //Argument 1 must be string - ->argument(2, 'string'); //Argument 2 must be string - - $list = $this->getBucket($bucket); - - if(strpos($path, '/') === 0) { - $path = substr($path, 1); - } - - if(substr($path, -1) == '/') { - $path = substr($path, 0, -1); - } - - - $files = array(); - foreach($list as $object) { - //if the oject does not start with the path - if(strpos($object['name'], $path) !== 0) { - //skip it - continue; - } - - $this->deleteFile($bucket, '/'.$object['name']); - } - - return true; - } - - /** - * Get contents for a bucket - * - * If maxKeys is NULL this method will loop through truncated result sets - * - * @param string $name Bucket name - * @param string $prefix Prefix - * @param string $marker Marker (last file listed) - * @param string $maxKeys Max keys (maximum number of keys to return) - * @param string $delimiter Delimiter - * @return array | false - */ - public function getBucket($name, $prefix = NULL, $marker = NULL, $maxKeys = NULL, $delimiter = NULL) { - //argument test - Eden_Amazon_Error::i() - ->argument(1, 'string') //Argument 1 must be string - ->argument(2, 'string', 'null') //Argument 2 must be string or null - ->argument(3, 'string', 'null') //Argument 3 must be string or null - ->argument(4, 'string', 'null') //Argument 4 must be string or null - ->argument(5, 'string', 'null'); //Argument 5 must be string or null - - $bucket = array(); - - do { - $query = array(); - if($prefix) { - $query['prefix'] = $prefix; - } - - if($marker) { - $query['marker'] = $marker; - } - - if($maxKeys) { - $query['max-keys'] = $maxKeys; - } - - if($delimiter) { - $query['delimiter'] = $delimiter; - } - - $this->_setResponse('GET', $name, '/', $query); - - if(!empty($this->_meta['error']) || empty($this->_response)) { - break; - } - - - $nextMarker = NULL; - foreach ($this->_response->Contents as $content) { - $bucket[(string)$content->Key] = array( - 'name' => (string)$content->Key, - 'time' => strtotime((string)$content->LastModified), - 'size' => (string)$content->Size, - 'hash' => substr((string)$content->ETag, 1, -1) - ); - - $nextMarker = (string)$content->Key; - } - - foreach ($this->_response->CommonPrefixes as $prefix) { - $bucket['prefixes'][] = (string)$prefixes->Prefix; - } - - if(isset($this->_response->IsTruncated) && $this->_response->IsTruncated == 'false') { - break; - } - - if (isset($this->_response->NextMarker)) { - $nextMarker = (string)$this->_response->NextMarker; - } - } while(!$maxKeys && $nextMarker); - - return $bucket; - } - - /** - * Get a list of buckets - * - * @param boolean $detailed Returns detailed bucket list when true - * @return array | false - */ - public function getBuckets() { - $this->_setResponse('GET'); - - if(!empty($this->_meta['error']) || empty($this->_response)) { - return false; - } - - $buckets = array(); - foreach ($this->_response->Buckets->Bucket as $bucket) { - $buckets[] = (string)$bucket->Name; - } - - return $buckets; - } - - /** - * Get an object - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @param mixed $saveTo Filename or resource to write to - * @return mixed - */ - public function getFile($bucket, $path) { - //argument test - Eden_Amazon_Error::i() - ->argument(1, 'string') //Argument 1 must be string - ->argument(2, 'string'); //Argument 2 must be string - - $this->_setResponse('GET', $bucket, $path); - - if(!empty($this->_meta['error']) || empty($this->_response)) { - return false; - } - - return $this->_response; - } - - /** - * Get object information - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @param boolean $returnInfo Return response information - * @return mixed | false - */ - public function getFileInfo($bucket, $path) { - //argument test - Eden_Amazon_Error::i() - ->argument(1, 'string') //Argument 1 must be string - ->argument(2, 'string'); //Argument 2 must be string - - if(strpos($path, '/') !== 0) { - $path = '/'.$path; - } - - $this->_setResponse('HEAD', $bucket, $path); - - if(!empty($this->_meta['error'])) { - return false; - } - - return $this->_meta['headers']; - } - - /** - * Get files for a bucket given a path - * - * If maxKeys is NULL this method will loop through truncated result sets - * - * @param string $bucket Bucket name - * @param string $prefix Prefix - * @param string $marker Marker (last file listed) - * @param string $maxKeys Max keys (maximum number of keys to return) - * @param string $delimiter Delimiter - * @param boolean $prefixes Set to true to return CommonPrefixes - * @return array | false - */ - public function getFiles($bucket, $path = NULL, $prefix = NULL, $marker = NULL, $maxKeys = NULL, $delimiter = NULL) { - //argument test - Eden_Amazon_Error::i() - ->argument(1, 'string') //Argument 1 must be string - ->argument(2, 'string', 'null') //Argument 2 must be string or null - ->argument(3, 'string', 'null') //Argument 3 must be string or null - ->argument(4, 'string', 'null') //Argument 4 must be string or null - ->argument(5, 'string', 'null') //Argument 5 must be string or null - ->argument(6, 'string', 'null'); //Argument 6 must be string or null - - $bucket = $this->getBucket($bucket, $prefix, $marker, $maxKeys, $delimiter); - - if(strpos($path, '/') === 0) { - $path = substr($path, 1); - } - - if(substr($path, -1) == '/') { - $path = substr($path, 0, -1); - } - - $files = array(); - foreach($bucket as $object) { - $name = $object['name']; - if($path) { - //if the oject does not start with the path - if(strpos($name, $path.'/') !== 0) { - //skip it - continue; - } - - //remove the path - $name = substr($name, strlen($path.'/')); - } - - //if the oject has a / or - //if this is an s3fox folder - if(strpos($name, '/') !== false || strpos($name, '_$folder$') !== false) { - //skip it - continue; - } - - $files[$name] = true; - } - - return array_keys($files); - } - - /** - * Get folders given a path - * - * If maxKeys is NULL this method will loop through truncated result sets - * - * @param string $bucket Bucket name - * @param string path - * @param string $prefix Prefix - * @param string $marker Marker (last file listed) - * @param string $maxKeys Max keys (maximum number of keys to return) - * @param string $delimiter Delimiter - * @param boolean $prefixes Set to true to return CommonPrefixes - * @return array | false - */ - public function getFolders($bucket, $path = NULL, $prefix = NULL, $marker = NULL, $maxKeys = NULL, $delimiter = NULL) { - //argument test - Eden_Amazon_Error::i() - ->argument(1, 'string') //Argument 1 must be string - ->argument(2, 'string', 'null') //Argument 2 must be string or null - ->argument(3, 'string', 'null') //Argument 3 must be string or null - ->argument(4, 'string', 'null') //Argument 4 must be string or null - ->argument(5, 'string', 'null') //Argument 5 must be string or null - ->argument(6, 'string', 'null'); //Argument 6 must be string or null - - $bucket = $this->getBucket($bucket, $prefix, $marker, $maxKeys, $delimiter); - - if(strpos($path, '/') === 0) { - $path = substr($path, 1); - } - - if(substr($path, -1) == '/') { - $path = substr($path, 0, -1); - } - - $folders = array(); - foreach($bucket as $object) { - $name = $object['name']; - if($path) { - //if the oject does not start with the path - if(strpos($name, $path.'/') !== 0) { - //skip it - continue; - } - - //remove the path - $name = substr($name, strlen($path.'/')); - } - - //we just care about the sub string before the / - $paths = explode('/', $name); - //if this is an s3fox folder - if(strpos($paths[0], '_$folder$') !== false) { - //remove the suffix - $paths[0] = str_replace('_$folder$', '', $paths[0]); - } - - $folders[$paths[0]] = true; - } - - return array_keys($folders); - } - - /** - * Gets the size of a folder - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @return boolean - */ - public function getFolderSize($bucket, $path) { - //argument test - Eden_Amazon_Error::i() - ->argument(1, 'string') //Argument 1 must be string - ->argument(2, 'string'); //Argument 2 must be string - - $bucket = $this->getBucket($bucket); - - if(strpos($path, '/') === 0) { - $path = substr($path, 1); - } - - if(substr($path, -1) == '/') { - $path = substr($path, 0, -1); - } - - $size = 0; - foreach($bucket as $object) { - //if the oject does not start with the path - if(strpos($object['name'], $path.'/') !== 0) { - //skip it - continue; - } - - $size += $object['size']; - } - - return $size; - } - - public function getMeta($key = NULL) { - if(isset($this->_meta[$key])) { - return $this->_meta[$key]; - } - - return $this->_meta; - } - - /** - * Get object or bucket Access Control Policy - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @return mixed | false - */ - public function getPermissions($bucket, $path = '/') { - //argument test - Eden_Amazon_Error::i() - ->argument(1, 'string') //Argument 1 must be string - ->argument(2, 'string'); //Argument 2 must be string - - $query['acl'] = NULL; - $this->_setResponse('GET', $bucket, $path); - - if(!empty($this->_meta['error']) || empty($this->_response)) { - return false; - } - - $permission = array(); - if (isset($this->_response->Owner, $this->_response->Owner->ID, $this->_response->Owner->DisplayName)) { - $permission['owner'] = array( - 'id' => $this->_response->Owner->ID, - 'name' => $this->_response->Owner->DisplayName); - } - - if (isset($this->_response->AccessControlList)) { - $acp['users'] = array(); - foreach ($this->_response->AccessControlList->Grant as $grant) { - foreach ($grant->Grantee as $grantee) { - if (isset($grantee->ID, $grantee->DisplayName)) { // CanonicalUser - - $permission['users'][] = array( - 'type' => 'CanonicalUser', - 'id' => $grantee->ID, - 'name' => $grantee->DisplayName, - 'permission' => $grant->Permission); - - } else if (isset($grantee->EmailAddress)) { // AmazonCustomerByEmail - - $permission['users'][] = array( - 'type' => 'AmazonCustomerByEmail', - 'email' => $grantee->EmailAddress, - 'permission' => $grant->Permission); - - } else if (isset($grantee->URI)) { // Group - - $permission['users'][] = array( - 'type' => 'Group', - 'uri' => $grantee->URI, - 'permission' => $grant->Permission); - - } - } - } - } - - return $permission; - } - - /** - * Set object or bucket Access Control Policy - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @param array $acp Access Control Policy Data (same as the data returned from getAccessControlPolicy) - * @return boolean - */ - public function setPermissions($bucket, $path = '/', array $acp = array()) { - //argument test - Eden_Amazon_Error::i() - ->argument(1, 'string') //Argument 1 must be string - ->argument(2, 'string'); //Argument 2 must be string - - $dom = new DOMDocument; - $dom->formatOutput = true; - $policy = $dom->createElement('AccessControlPolicy'); - $list = $dom->createElement('AccessControlList'); - - // It seems the owner has to be passed along too - $owner = $dom->createElement('Owner'); - $owner->appendChild($dom->createElement('ID', $acp['owner']['id'])); - $owner->appendChild($dom->createElement('DisplayName', $acp['owner']['name'])); - $policy->appendChild($owner); - - foreach ($acp['acl'] as $permission) { - $grant = $dom->createElement('Grant'); - $grantee = $dom->createElement('Grantee'); - - $grantee->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); - - if (isset($permission['id'])) { // CanonicalUser (DisplayName is omitted) - $grantee->setAttribute('xsi:type', 'CanonicalUser'); - $grantee->appendChild($dom->createElement('ID', $permission['id'])); - } elseif (isset($permission['email'])) { // AmazonCustomerByEmail - $grantee->setAttribute('xsi:type', 'AmazonCustomerByEmail'); - $grantee->appendChild($dom->createElement('EmailAddress', $permission['email'])); - } elseif ($permission['type'] == 'Group') { // Group - $grantee->setAttribute('xsi:type', 'Group'); - $grantee->appendChild($dom->createElement('URI', $permission['uri'])); - } - - $grant->appendChild($grantee); - $grant->appendChild($dom->createElement('Permission', $permission['permission'])); - $list->appendChild($grant); - } - - $policy->appendChild($list); - $dom->appendChild($policy); - - $data = $dom->saveXML(); - $query = array('acl' => NULL); - $header = array('Content-Type' => 'application/xml'); - - $this->_setResponse('PUT', $bucket, $path, $query, $data, $headers); - - if(!empty($this->_meta['error']) || empty($this->_response)) { - return false; - } - - return true; - } - - /* Protected Methods - -------------------------------*/ - protected function _getHost($bucket = NULL) { - if(!$bucket) { - return $this->_host; - } - - return strtolower($bucket).'.'.$this->_host; - } - - protected function _getPath($bucket = NULL, $path = '/', array $query = array()) { - if ($bucket) { - return '/'.strtolower($bucket).$path; - } - - $keys = array_keys($query); - foreach($keys as $key) { - if(in_array($key, array('acl', 'location', 'torrent', 'logging'))) { - $query = http_build_query($query); - - $link = '?'; - if(strpos($path, '?') !== false) { - $link = '&'; - } - - return $path.$link.$query; - } - } - - return $path; - } - - protected function _getSignature($string) { - if(extension_loaded('hash')) { - $hash = base64_encode(hash_hmac('sha1', $string, $this->_pass, true)); - } else { - $pad1 = str_pad($this->_pass, 64, chr(0x00)) ^ str_repeat(chr(0x36), 64); - $pad2 = str_pad($this->_pass, 64, chr(0x00)) ^ str_repeat(chr(0x5c), 64); - $pack1 = pack('H*', sha1($pad1 . $string)); - $pack2 = pack('H*', sha1($pad2 . $pack1)); - $hash = base64_encode($pack2); - } - - return 'AWS '.$this->_user.':'.$hash; - } - - protected function _getUrl($host, $path, $query = NULL) { - if(is_array($query)) { - $query = http_build_query($query); - } - - $link = '?'; - if(strpos($path, '?') !== false) { - $link = '&'; - } - - $protocol = 'http://'; - if($this->_ssl && extension_loaded('openssl')) { - $protocol = 'https://'; - } - - return $protocol.$host.$path.$link.$query; - } - - protected function _responseHeaderCallback(&$curl, &$data) { - $strlen = strlen($data); - if ($strlen <= 2) { - return $strlen; - } - - if (substr($data, 0, 4) == 'HTTP') { - $this->_meta['code'] = substr($data, 9, 3); - return $strlen; - } - - list($header, $value) = explode(': ', trim($data), 2); - - if ($header == 'Last-Modified') { - $this->_meta['headers']['time'] = strtotime($value); - } else if ($header == 'Content-Length') { - $this->_meta['headers']['size'] = $value; - } else if ($header == 'Content-Type') { - $this->_meta['headers']['type'] = $value; - } else if ($header == 'ETag') { - $this->_meta['headers']['hash'] = $value{0} == '"' ? substr($value, 1, -1) : $value; - } else if (preg_match('/^x-amz-meta-.*$/', $header)) { - $this->_meta['headers'][$header] = $value; - } - - return $strlen; - } - - protected function _responseWriteCallback(&$curl, &$data) { - $this->_response .= $data; - return strlen($data); - } - - protected function _setResponse($action, $bucket = NULL, $path = '/', array $query = array(), - $data = NULL, array $headers = array(), array $amazon = array()) { - - //reset meta and response - $this->_meta = array(); - $this->_response = NULL; - - //get host - bucket1.s3.amazonaws.com - $host = $this->_getHost($bucket); - //get url - http://bucket1.s3.amazonaws.com/some/path - $url = $this->_getUrl($host, $path, $query); - //get path - /bucket1/some/path - $path = $this->_getPath($bucket, $path); - - //get headers - ksort($amazon); - $curlHeaders = $amazonHeaders = array(); - - $headers['Host'] = $host; - $headers['Date'] = gmdate('D, d M Y H:i:s T'); - - foreach ($amazon as $header => $value) { - $curlHeaders[] = $header.': '.$value; - $amazonHeaders[] = strtolower($header).':'.$value; - } - - foreach ($headers as $header => $value) { - $curlHeaders[] = $header.': '.$value; - } - - $amazonHeaders = "\n".implode("\n", $amazonHeaders); - - if(!trim($amazonHeaders)) { - $amazonHeaders = NULL; - } - - if(!isset($headers['Content-MD5'])) { - $headers['Content-MD5'] = NULL; - } - - if(!isset($headers['Content-Type'])) { - $headers['Content-Type'] = NULL; - } - - //get signature - $signature = array( - $action, - $headers['Content-MD5'], - $headers['Content-Type'], - $headers['Date'].$amazonHeaders, - $path); - - $signature = implode("\n", $signature); - if($headers['Host'] == 'cloudfront.amazonaws.com') { - $signature = $headers['Date']; - } - - $curlHeaders[] = 'Authorization: ' . $this->_getSignature($signature); - - //setup curl - $curl = Eden_Curl::i() - ->setUserAgent('S3/php') - ->setUrl($url) - ->setHeaders($curlHeaders) - ->setHeader(false) - ->setWriteFunction(array(&$this, '_responseWriteCallback')) - ->setHeaderFunction(array(&$this, '_responseHeaderCallback')) - ->when($this->_ssl) - ->verifyHost(true) - ->verifyPeer(true) - ->endWhen(); - - // Request types - switch ($action) { - case 'GET': - break; - case 'PUT': - case 'POST': // POST only used for CloudFront - $curl->setPut(true) - ->setInFile($data[0]) - ->setInFileSize($data[1]); - break; - case 'HEAD': - $curl->setCustomRequest('HEAD')->setNobody(true); - break; - case 'DELETE': - $curl->setCustomRequest('DELETE'); - break; - } - - $response = $curl->getResponse(); - $meta = $curl->getMeta(); - - // Execute, grab errors - if ($response) { - $this->_meta['code'] = $meta['info']; - $this->_meta['error'] = array(); - } else { - $this->_meta['error'] = array( - 'code' => $meta['error_code'], - 'message' => $meta['error_message'], - 'path' => $path); - } - - // Parse body into XML - if(empty($this->_meta['error']) - && isset($this->_meta['headers']['type']) - && $this->_meta['headers']['type'] == 'application/xml' - && strlen($this->_response) > 0) { - - $this->_response = simplexml_load_string($this->_response); - - if(!in_array($this->_meta['code'], array(200, 204)) - && isset($this->_response->Code, $this->_response->Message)) { - - $this->_meta['error'] = array( - 'code' => $this->_response->Code, - 'message' => $this->_response->Message, - 'path' => $path); - - if(isset($this->_response->Resource)) { - $this->_meta['error']['path'] = $this->_response->Resource; - } - - $this->_response = NULL; - } - } - - return $this; - } - - /* Private Methods - -------------------------------*/ -} + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Amazon S3 + * + * @package Eden + * @category amazon + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Amazon_S3 extends Eden_Class { + /* Constants + -------------------------------*/ + const ACL_PRIVATE = 'private'; + const ACL_PUBLIC_READ = 'public-read'; + const ACL_PUBLIC_READ_WRITE = 'public-read-write'; + const ACL_AUTHENTICATED_READ = 'authenticated-read'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_ssl = false; + protected $_host = 's3.amazonaws.com'; + protected $_user = NULL; + protected $_pass = NULL; + + protected $_meta = array(); + protected $_response = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($user, $pass, $host = 's3.amazonaws.com', $ssl = false) { + $this->_host = $host; + $this->_user = $user; + $this->_pass = $pass; + $this->_ssl = $ssl; + } + + /* Public Methods + -------------------------------*/ + /** + * Put a bucket + * + * @param string $bucket Bucket name + * @param constant $acl ACL flag + * @param string $location Set as "EU" to create buckets hosted in Europe + * @return boolean + */ + public function addBucket($bucket, $acl = self::ACL_PRIVATE, $location = false) { + //argument test + Eden_Amazon_Error::i() + ->argument(1, 'string') //Argument 1 must be string + ->argument(2, 'string', 'null') //Argument 2 must be string or null + ->argument(3, 'bool'); //Argument 3 must be bool + + $data = NULL; + $headers = array(); + $amazon = array('x-amz-acl' => $acl); + + if ($location !== false) { + $dom = new DOMDocument; + $config = $dom->createElement('CreateBucketConfiguration'); + $constraint = $dom->createElement('LocationConstraint', strtoupper($location)); + + $config->appendChild($constraint); + $dom->appendChild($config); + $data = $dom->saveXML(); + + $headers['Content-Type'] = 'application/xml'; + } + + $this->_setResponse('PUT', $bucket, '/', array(), $data, $headers, $amazon); + + if(!empty($this->_meta['error']) || empty($this->_response)) { + return false; + } + + return true; + } + + /** + * Put an object + * + * @param mixed $input Input data + * @param string $bucket Bucket name + * @param string $path Object URI + * @param constant $acl ACL constant + * @param array $metaHeaders Array of x-amz-meta-* headers + * @param array $requestHeaders Array of request headers or content type as a string + * @return boolean + */ + public function addFile($bucket, $path, $data, $acl = self::ACL_PRIVATE, $file = false) { + //argument test + Eden_Amazon_Error::i() + ->argument(1, 'string') //Argument 1 must be string + ->argument(2, 'string') //Argument 2 must be string + ->argument(4, 'string') //Argument 4 must be string + ->argument(5, 'bool'); //Argument 5 must be boolean + + $headers = $amazon = array(); + + $headers['Content-Type'] = Eden_File::i()->getMimeType($path); + $amazon['x-amz-acl'] = $acl; + + if(strpos($path, '/') !== 0) { + $path = '/'.$path; + } + + //if not file + if(!$file) { + //put it into a file + //we do this because file data in memory is bad + $tmp = tmpfile(); + fwrite($tmp, $data); + $file = $tmp; + $size = strlen($data); + //release file data from memory + $data = NULL; + //if is a file + } else { + $file = fopen($data, 'r'); + $size = filesize($data); + } + + $data = array($file, $size); + + $this->_setResponse('PUT', $bucket, $path, array(), $data, $headers, $amazon); + + //dont forget to close + fclose($file); + + if(!empty($this->_meta['error'])) { + return false; + } + + return $size; + } + + /** + * Delete an empty bucket + * + * @param string $bucket Bucket name + * @return boolean + */ + public function deleteBucket($bucket) { + //Argument 1 must be string + Eden_Amazon_Error::i()->argument(1, 'string'); + $this->_setResponse('DELETE', $bucket); + + if(!empty($this->_meta['error']) || empty($this->_response)) { + return false; + } + + return true; + } + + /** + * Delete an object + * + * @param string $bucket Bucket name + * @param string $uri Object URI + * @return boolean + */ + public function deleteFile($bucket, $path) { + //argument test + Eden_Amazon_Error::i() + ->argument(1, 'string') //Argument 1 must be string + ->argument(2, 'string'); //Argument 2 must be string + + $this->_setResponse('DELETE', $bucket, $path); + + if(!empty($this->_meta['error']) || empty($this->_response)) { + return false; + } + + return true; + } + + /** + * Delete an object + * + * @param string $bucket Bucket name + * @param string $uri Object URI + * @return boolean + */ + public function deleteFolder($bucket, $path) { + //argument test + Eden_Amazon_Error::i() + ->argument(1, 'string') //Argument 1 must be string + ->argument(2, 'string'); //Argument 2 must be string + + $list = $this->getBucket($bucket); + + if(strpos($path, '/') === 0) { + $path = substr($path, 1); + } + + if(substr($path, -1) == '/') { + $path = substr($path, 0, -1); + } + + + $files = array(); + foreach($list as $object) { + //if the oject does not start with the path + if(strpos($object['name'], $path) !== 0) { + //skip it + continue; + } + + $this->deleteFile($bucket, '/'.$object['name']); + } + + return true; + } + + /** + * Get contents for a bucket + * + * If maxKeys is NULL this method will loop through truncated result sets + * + * @param string $name Bucket name + * @param string $prefix Prefix + * @param string $marker Marker (last file listed) + * @param string $maxKeys Max keys (maximum number of keys to return) + * @param string $delimiter Delimiter + * @return array | false + */ + public function getBucket($name, $prefix = NULL, $marker = NULL, $maxKeys = NULL, $delimiter = NULL) { + //argument test + Eden_Amazon_Error::i() + ->argument(1, 'string') //Argument 1 must be string + ->argument(2, 'string', 'null') //Argument 2 must be string or null + ->argument(3, 'string', 'null') //Argument 3 must be string or null + ->argument(4, 'string', 'null') //Argument 4 must be string or null + ->argument(5, 'string', 'null'); //Argument 5 must be string or null + + $bucket = array(); + + do { + $query = array(); + if($prefix) { + $query['prefix'] = $prefix; + } + + if($marker) { + $query['marker'] = $marker; + } + + if($maxKeys) { + $query['max-keys'] = $maxKeys; + } + + if($delimiter) { + $query['delimiter'] = $delimiter; + } + + $this->_setResponse('GET', $name, '/', $query); + + if(!empty($this->_meta['error']) || empty($this->_response)) { + break; + } + + + $nextMarker = NULL; + foreach ($this->_response->Contents as $content) { + $bucket[(string)$content->Key] = array( + 'name' => (string)$content->Key, + 'time' => strtotime((string)$content->LastModified), + 'size' => (string)$content->Size, + 'hash' => substr((string)$content->ETag, 1, -1) + ); + + $nextMarker = (string)$content->Key; + } + + foreach ($this->_response->CommonPrefixes as $prefix) { + $bucket['prefixes'][] = (string)$prefixes->Prefix; + } + + if(isset($this->_response->IsTruncated) && $this->_response->IsTruncated == 'false') { + break; + } + + if (isset($this->_response->NextMarker)) { + $nextMarker = (string)$this->_response->NextMarker; + } + } while(!$maxKeys && $nextMarker); + + return $bucket; + } + + /** + * Get a list of buckets + * + * @param boolean $detailed Returns detailed bucket list when true + * @return array | false + */ + public function getBuckets() { + $this->_setResponse('GET'); + + if(!empty($this->_meta['error']) || empty($this->_response)) { + return false; + } + + $buckets = array(); + foreach ($this->_response->Buckets->Bucket as $bucket) { + $buckets[] = (string)$bucket->Name; + } + + return $buckets; + } + + /** + * Get an object + * + * @param string $bucket Bucket name + * @param string $uri Object URI + * @param mixed $saveTo Filename or resource to write to + * @return mixed + */ + public function getFile($bucket, $path) { + //argument test + Eden_Amazon_Error::i() + ->argument(1, 'string') //Argument 1 must be string + ->argument(2, 'string'); //Argument 2 must be string + + $this->_setResponse('GET', $bucket, $path); + + if(!empty($this->_meta['error']) || empty($this->_response)) { + return false; + } + + return $this->_response; + } + + /** + * Get object information + * + * @param string $bucket Bucket name + * @param string $uri Object URI + * @param boolean $returnInfo Return response information + * @return mixed | false + */ + public function getFileInfo($bucket, $path) { + //argument test + Eden_Amazon_Error::i() + ->argument(1, 'string') //Argument 1 must be string + ->argument(2, 'string'); //Argument 2 must be string + + if(strpos($path, '/') !== 0) { + $path = '/'.$path; + } + + $this->_setResponse('HEAD', $bucket, $path); + + if(!empty($this->_meta['error'])) { + return false; + } + + return $this->_meta['headers']; + } + + /** + * Get files for a bucket given a path + * + * If maxKeys is NULL this method will loop through truncated result sets + * + * @param string $bucket Bucket name + * @param string $prefix Prefix + * @param string $marker Marker (last file listed) + * @param string $maxKeys Max keys (maximum number of keys to return) + * @param string $delimiter Delimiter + * @param boolean $prefixes Set to true to return CommonPrefixes + * @return array | false + */ + public function getFiles($bucket, $path = NULL, $prefix = NULL, $marker = NULL, $maxKeys = NULL, $delimiter = NULL) { + //argument test + Eden_Amazon_Error::i() + ->argument(1, 'string') //Argument 1 must be string + ->argument(2, 'string', 'null') //Argument 2 must be string or null + ->argument(3, 'string', 'null') //Argument 3 must be string or null + ->argument(4, 'string', 'null') //Argument 4 must be string or null + ->argument(5, 'string', 'null') //Argument 5 must be string or null + ->argument(6, 'string', 'null'); //Argument 6 must be string or null + + $bucket = $this->getBucket($bucket, $prefix, $marker, $maxKeys, $delimiter); + + if(strpos($path, '/') === 0) { + $path = substr($path, 1); + } + + if(substr($path, -1) == '/') { + $path = substr($path, 0, -1); + } + + $files = array(); + foreach($bucket as $object) { + $name = $object['name']; + if($path) { + //if the oject does not start with the path + if(strpos($name, $path.'/') !== 0) { + //skip it + continue; + } + + //remove the path + $name = substr($name, strlen($path.'/')); + } + + //if the oject has a / or + //if this is an s3fox folder + if(strpos($name, '/') !== false || strpos($name, '_$folder$') !== false) { + //skip it + continue; + } + + $files[$name] = true; + } + + return array_keys($files); + } + + /** + * Get folders given a path + * + * If maxKeys is NULL this method will loop through truncated result sets + * + * @param string $bucket Bucket name + * @param string path + * @param string $prefix Prefix + * @param string $marker Marker (last file listed) + * @param string $maxKeys Max keys (maximum number of keys to return) + * @param string $delimiter Delimiter + * @param boolean $prefixes Set to true to return CommonPrefixes + * @return array | false + */ + public function getFolders($bucket, $path = NULL, $prefix = NULL, $marker = NULL, $maxKeys = NULL, $delimiter = NULL) { + //argument test + Eden_Amazon_Error::i() + ->argument(1, 'string') //Argument 1 must be string + ->argument(2, 'string', 'null') //Argument 2 must be string or null + ->argument(3, 'string', 'null') //Argument 3 must be string or null + ->argument(4, 'string', 'null') //Argument 4 must be string or null + ->argument(5, 'string', 'null') //Argument 5 must be string or null + ->argument(6, 'string', 'null'); //Argument 6 must be string or null + + $bucket = $this->getBucket($bucket, $prefix, $marker, $maxKeys, $delimiter); + + if(strpos($path, '/') === 0) { + $path = substr($path, 1); + } + + if(substr($path, -1) == '/') { + $path = substr($path, 0, -1); + } + + $folders = array(); + foreach($bucket as $object) { + $name = $object['name']; + if($path) { + //if the oject does not start with the path + if(strpos($name, $path.'/') !== 0) { + //skip it + continue; + } + + //remove the path + $name = substr($name, strlen($path.'/')); + } + + //we just care about the sub string before the / + $paths = explode('/', $name); + //if this is an s3fox folder + if(strpos($paths[0], '_$folder$') !== false) { + //remove the suffix + $paths[0] = str_replace('_$folder$', '', $paths[0]); + } + + $folders[$paths[0]] = true; + } + + return array_keys($folders); + } + + /** + * Gets the size of a folder + * + * @param string $bucket Bucket name + * @param string $uri Object URI + * @return boolean + */ + public function getFolderSize($bucket, $path) { + //argument test + Eden_Amazon_Error::i() + ->argument(1, 'string') //Argument 1 must be string + ->argument(2, 'string'); //Argument 2 must be string + + $bucket = $this->getBucket($bucket); + + if(strpos($path, '/') === 0) { + $path = substr($path, 1); + } + + if(substr($path, -1) == '/') { + $path = substr($path, 0, -1); + } + + $size = 0; + foreach($bucket as $object) { + //if the oject does not start with the path + if(strpos($object['name'], $path.'/') !== 0) { + //skip it + continue; + } + + $size += $object['size']; + } + + return $size; + } + + public function getMeta($key = NULL) { + if(isset($this->_meta[$key])) { + return $this->_meta[$key]; + } + + return $this->_meta; + } + + /** + * Get object or bucket Access Control Policy + * + * @param string $bucket Bucket name + * @param string $uri Object URI + * @return mixed | false + */ + public function getPermissions($bucket, $path = '/') { + //argument test + Eden_Amazon_Error::i() + ->argument(1, 'string') //Argument 1 must be string + ->argument(2, 'string'); //Argument 2 must be string + + $query['acl'] = NULL; + $this->_setResponse('GET', $bucket, $path); + + if(!empty($this->_meta['error']) || empty($this->_response)) { + return false; + } + + $permission = array(); + if (isset($this->_response->Owner, $this->_response->Owner->ID, $this->_response->Owner->DisplayName)) { + $permission['owner'] = array( + 'id' => $this->_response->Owner->ID, + 'name' => $this->_response->Owner->DisplayName); + } + + if (isset($this->_response->AccessControlList)) { + $acp['users'] = array(); + foreach ($this->_response->AccessControlList->Grant as $grant) { + foreach ($grant->Grantee as $grantee) { + if (isset($grantee->ID, $grantee->DisplayName)) { // CanonicalUser + + $permission['users'][] = array( + 'type' => 'CanonicalUser', + 'id' => $grantee->ID, + 'name' => $grantee->DisplayName, + 'permission' => $grant->Permission); + + } else if (isset($grantee->EmailAddress)) { // AmazonCustomerByEmail + + $permission['users'][] = array( + 'type' => 'AmazonCustomerByEmail', + 'email' => $grantee->EmailAddress, + 'permission' => $grant->Permission); + + } else if (isset($grantee->URI)) { // Group + + $permission['users'][] = array( + 'type' => 'Group', + 'uri' => $grantee->URI, + 'permission' => $grant->Permission); + + } + } + } + } + + return $permission; + } + + /** + * Set object or bucket Access Control Policy + * + * @param string $bucket Bucket name + * @param string $uri Object URI + * @param array $acp Access Control Policy Data (same as the data returned from getAccessControlPolicy) + * @return boolean + */ + public function setPermissions($bucket, $path = '/', array $acp = array()) { + //argument test + Eden_Amazon_Error::i() + ->argument(1, 'string') //Argument 1 must be string + ->argument(2, 'string'); //Argument 2 must be string + + $dom = new DOMDocument; + $dom->formatOutput = true; + $policy = $dom->createElement('AccessControlPolicy'); + $list = $dom->createElement('AccessControlList'); + + // It seems the owner has to be passed along too + $owner = $dom->createElement('Owner'); + $owner->appendChild($dom->createElement('ID', $acp['owner']['id'])); + $owner->appendChild($dom->createElement('DisplayName', $acp['owner']['name'])); + $policy->appendChild($owner); + + foreach ($acp['acl'] as $permission) { + $grant = $dom->createElement('Grant'); + $grantee = $dom->createElement('Grantee'); + + $grantee->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); + + if (isset($permission['id'])) { // CanonicalUser (DisplayName is omitted) + $grantee->setAttribute('xsi:type', 'CanonicalUser'); + $grantee->appendChild($dom->createElement('ID', $permission['id'])); + } elseif (isset($permission['email'])) { // AmazonCustomerByEmail + $grantee->setAttribute('xsi:type', 'AmazonCustomerByEmail'); + $grantee->appendChild($dom->createElement('EmailAddress', $permission['email'])); + } elseif ($permission['type'] == 'Group') { // Group + $grantee->setAttribute('xsi:type', 'Group'); + $grantee->appendChild($dom->createElement('URI', $permission['uri'])); + } + + $grant->appendChild($grantee); + $grant->appendChild($dom->createElement('Permission', $permission['permission'])); + $list->appendChild($grant); + } + + $policy->appendChild($list); + $dom->appendChild($policy); + + $data = $dom->saveXML(); + $query = array('acl' => NULL); + $header = array('Content-Type' => 'application/xml'); + + $this->_setResponse('PUT', $bucket, $path, $query, $data, $headers); + + if(!empty($this->_meta['error']) || empty($this->_response)) { + return false; + } + + return true; + } + + /* Protected Methods + -------------------------------*/ + protected function _getHost($bucket = NULL) { + if(!$bucket) { + return $this->_host; + } + + return strtolower($bucket).'.'.$this->_host; + } + + protected function _getPath($bucket = NULL, $path = '/', array $query = array()) { + if ($bucket) { + return '/'.strtolower($bucket).$path; + } + + $keys = array_keys($query); + foreach($keys as $key) { + if(in_array($key, array('acl', 'location', 'torrent', 'logging'))) { + $query = http_build_query($query); + + $link = '?'; + if(strpos($path, '?') !== false) { + $link = '&'; + } + + return $path.$link.$query; + } + } + + return $path; + } + + protected function _getSignature($string) { + if(extension_loaded('hash')) { + $hash = base64_encode(hash_hmac('sha1', $string, $this->_pass, true)); + } else { + $pad1 = str_pad($this->_pass, 64, chr(0x00)) ^ str_repeat(chr(0x36), 64); + $pad2 = str_pad($this->_pass, 64, chr(0x00)) ^ str_repeat(chr(0x5c), 64); + $pack1 = pack('H*', sha1($pad1 . $string)); + $pack2 = pack('H*', sha1($pad2 . $pack1)); + $hash = base64_encode($pack2); + } + + return 'AWS '.$this->_user.':'.$hash; + } + + protected function _getUrl($host, $path, $query = NULL) { + if(is_array($query)) { + $query = http_build_query($query); + } + + $link = '?'; + if(strpos($path, '?') !== false) { + $link = '&'; + } + + $protocol = 'http://'; + if($this->_ssl && extension_loaded('openssl')) { + $protocol = 'https://'; + } + + return $protocol.$host.$path.$link.$query; + } + + protected function _responseHeaderCallback(&$curl, &$data) { + $strlen = strlen($data); + if ($strlen <= 2) { + return $strlen; + } + + if (substr($data, 0, 4) == 'HTTP') { + $this->_meta['code'] = substr($data, 9, 3); + return $strlen; + } + + list($header, $value) = explode(': ', trim($data), 2); + + if ($header == 'Last-Modified') { + $this->_meta['headers']['time'] = strtotime($value); + } else if ($header == 'Content-Length') { + $this->_meta['headers']['size'] = $value; + } else if ($header == 'Content-Type') { + $this->_meta['headers']['type'] = $value; + } else if ($header == 'ETag') { + $this->_meta['headers']['hash'] = $value{0} == '"' ? substr($value, 1, -1) : $value; + } else if (preg_match('/^x-amz-meta-.*$/', $header)) { + $this->_meta['headers'][$header] = $value; + } + + return $strlen; + } + + protected function _responseWriteCallback(&$curl, &$data) { + $this->_response .= $data; + return strlen($data); + } + + protected function _setResponse($action, $bucket = NULL, $path = '/', array $query = array(), + $data = NULL, array $headers = array(), array $amazon = array()) { + + //reset meta and response + $this->_meta = array(); + $this->_response = NULL; + + //get host - bucket1.s3.amazonaws.com + $host = $this->_getHost($bucket); + //get url - http://bucket1.s3.amazonaws.com/some/path + $url = $this->_getUrl($host, $path, $query); + //get path - /bucket1/some/path + $path = $this->_getPath($bucket, $path); + + //get headers + ksort($amazon); + $curlHeaders = $amazonHeaders = array(); + + $headers['Host'] = $host; + $headers['Date'] = gmdate('D, d M Y H:i:s T'); + + foreach ($amazon as $header => $value) { + $curlHeaders[] = $header.': '.$value; + $amazonHeaders[] = strtolower($header).':'.$value; + } + + foreach ($headers as $header => $value) { + $curlHeaders[] = $header.': '.$value; + } + + $amazonHeaders = "\n".implode("\n", $amazonHeaders); + + if(!trim($amazonHeaders)) { + $amazonHeaders = NULL; + } + + if(!isset($headers['Content-MD5'])) { + $headers['Content-MD5'] = NULL; + } + + if(!isset($headers['Content-Type'])) { + $headers['Content-Type'] = NULL; + } + + //get signature + $signature = array( + $action, + $headers['Content-MD5'], + $headers['Content-Type'], + $headers['Date'].$amazonHeaders, + $path); + + $signature = implode("\n", $signature); + if($headers['Host'] == 'cloudfront.amazonaws.com') { + $signature = $headers['Date']; + } + + $curlHeaders[] = 'Authorization: ' . $this->_getSignature($signature); + + //setup curl + $curl = Eden_Curl::i() + ->setUserAgent('S3/php') + ->setUrl($url) + ->setHeaders($curlHeaders) + ->setHeader(false) + ->setWriteFunction(array(&$this, '_responseWriteCallback')) + ->setHeaderFunction(array(&$this, '_responseHeaderCallback')) + ->when($this->_ssl) + ->verifyHost(true) + ->verifyPeer(true) + ->endWhen(); + + // Request types + switch ($action) { + case 'GET': + break; + case 'PUT': + case 'POST': // POST only used for CloudFront + $curl->setPut(true) + ->setInFile($data[0]) + ->setInFileSize($data[1]); + break; + case 'HEAD': + $curl->setCustomRequest('HEAD')->setNobody(true); + break; + case 'DELETE': + $curl->setCustomRequest('DELETE'); + break; + } + + $response = $curl->getResponse(); + $meta = $curl->getMeta(); + + // Execute, grab errors + if ($response) { + $this->_meta['code'] = $meta['info']; + $this->_meta['error'] = array(); + } else { + $this->_meta['error'] = array( + 'code' => $meta['error_code'], + 'message' => $meta['error_message'], + 'path' => $path); + } + + // Parse body into XML + if(empty($this->_meta['error']) + && isset($this->_meta['headers']['type']) + && $this->_meta['headers']['type'] == 'application/xml' + && strlen($this->_response) > 0) { + + $this->_response = simplexml_load_string($this->_response); + + if(!in_array($this->_meta['code'], array(200, 204)) + && isset($this->_response->Code, $this->_response->Message)) { + + $this->_meta['error'] = array( + 'code' => $this->_response->Code, + 'message' => $this->_response->Message, + 'path' => $path); + + if(isset($this->_response->Resource)) { + $this->_meta['error']['path'] = $this->_response->Resource; + } + + $this->_response = NULL; + } + } + + return $this; + } + + /* Private Methods + -------------------------------*/ +} diff --git a/library/eden/asiapay.php b/library/eden/asiapay.php index e84ec02..f66cc07 100644 --- a/library/eden/asiapay.php +++ b/library/eden/asiapay.php @@ -1,80 +1,80 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/template.php'; -require_once dirname(__FILE__).'/asiapay/error.php'; -require_once dirname(__FILE__).'/asiapay/base.php'; -require_once dirname(__FILE__).'/asiapay/client.php'; -require_once dirname(__FILE__).'/asiapay/directclient.php'; - -/** - * Asiapay API factory. This is a factory class with - * methods that will load up different asiapay classes. - * Asiapay classes are organized as described on their - * developer site: client and directclient. - * - * @package Eden - * @category asiapay - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Asiapay extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /** - * Returns asiapay client post - * - * @param *string - * @param *boolean - * @return Eden_Asiapay_Client - */ - public function clientPost($merchantId, $test = true) { - - //argument test - Eden_Asiapay_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'bool'); //Argument 2 must be a boolean - - return Eden_Asiapay_Client::i($merchantId, $test); - } - - /** - * Returns asiapay direct client - * - * @param *string - * @param *boolean - * @return Eden_Asiapay_Directclient - */ - public function directClient($merchantId, $test = true) { - //argument test - Eden_Asiapay_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'bool'); //Argument 2 must be a boolean - - return Eden_Asiapay_Directclient::i($merchantId, $test); - } - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/template.php'; +require_once dirname(__FILE__).'/asiapay/error.php'; +require_once dirname(__FILE__).'/asiapay/base.php'; +require_once dirname(__FILE__).'/asiapay/client.php'; +require_once dirname(__FILE__).'/asiapay/directclient.php'; + +/** + * Asiapay API factory. This is a factory class with + * methods that will load up different asiapay classes. + * Asiapay classes are organized as described on their + * developer site: client and directclient. + * + * @package Eden + * @category asiapay + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Asiapay extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /** + * Returns asiapay client post + * + * @param *string + * @param *boolean + * @return Eden_Asiapay_Client + */ + public function clientPost($merchantId, $test = true) { + + //argument test + Eden_Asiapay_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'bool'); //Argument 2 must be a boolean + + return Eden_Asiapay_Client::i($merchantId, $test); + } + + /** + * Returns asiapay direct client + * + * @param *string + * @param *boolean + * @return Eden_Asiapay_Directclient + */ + public function directClient($merchantId, $test = true) { + //argument test + Eden_Asiapay_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'bool'); //Argument 2 must be a boolean + + return Eden_Asiapay_Directclient::i($merchantId, $test); + } + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/authorizenet.php b/library/eden/authorizenet.php index 6000f4f..aa11eac 100644 --- a/library/eden/authorizenet.php +++ b/library/eden/authorizenet.php @@ -1,140 +1,140 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/curl.php'; -require_once dirname(__FILE__).'/authorizenet/error.php'; -require_once dirname(__FILE__).'/authorizenet/base.php'; -require_once dirname(__FILE__).'/authorizenet/customer.php'; -require_once dirname(__FILE__).'/authorizenet/direct.php'; -require_once dirname(__FILE__).'/authorizenet/payment.php'; -require_once dirname(__FILE__).'/authorizenet/recurring.php'; -require_once dirname(__FILE__).'/authorizenet/server.php'; - -/** - * Authorize.net API factory. This is a factory class with - * methods that will load up different Authorize.net classes. - * Authorize.net classes are organized as described on their - * developer site: customer integration, direct post, advance - * integration, authomated recurring and server integration method - * - * @package Eden - * @category Authorize.net - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Authorizenet extends Eden_Class { - /* Constants - -------------------------------*/ - const PEM = '/authorizenet/cert.pem'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /** - * Returns authorize.net customer integration method - * - * @param *string API login key - * @param *string API transaction key - * @param *string API signature - * @param *boolean Live mode - * @return Eden_Authorizenet_Customer - */ - public function customer($apiLogin, $transactionKey, $live = false, $certificate = NULL) { - if(!is_string($certificate)) { - $certificate = dirname(__FILE__).self::PEM; - } - - return Eden_Authorizenet_Customer::i($apiLogin, $transactionKey, $certificate, $live); - } - - /** - * Returns authorize.net direct post method - * - * @param *string API login key - * @param *string API transaction key - * @param *string API signature - * @param *boolean Live mode - * @return Eden_Authorizenet_Direct - */ - public function direct($apiLogin, $transactionKey, $live = false, $certificate = NULL) { - if(!is_string($certificate)) { - $certificate = dirname(__FILE__).self::PEM; - } - - return Eden_Authorizenet_Direct::i($apiLogin, $transactionKey, $certificate, $live); - } - - /** - * Returns authorize.net advance integration method - * - * @param *string API login key - * @param *string API transaction key - * @param *string API signature - * @param *boolean Live mode - * @return Eden_Authorizenet_Payment - */ - public function payment($apiLogin, $transactionKey, $live = false, $certificate = NULL) { - if(!is_string($certificate)) { - $certificate = dirname(__FILE__).self::PEM; - } - - return Eden_Authorizenet_Payment::i($apiLogin, $transactionKey, $certificate, $live = false); - } - - /** - * Returns authorize.net authomated recurring method - * - * @param *string API login key - * @param *string API transaction key - * @param *string API signature - * @param *boolean Live mode - * @return Eden_Authorizenet_Recurring - */ - public function recurring($apiLogin, $transactionKey, $live = false, $certificate = NULL) { - if(!is_string($certificate)) { - $certificate = dirname(__FILE__).self::PEM; - } - - return Eden_Authorizenet_Recurring::i($apiLogin, $transactionKey, $certificate, $live = false); - } - - /** - * Returns authorize.net server integration method - * - * @param *string API login key - * @param *string API transaction key - * @param *string API signature - * @param *boolean Live mode - * @return Eden_Authorizenet_Server - */ - public function server($apiLogin, $transactionKey, $live = false, $certificate = NULL) { - if(!is_string($certificate)) { - $certificate = dirname(__FILE__).self::PEM; - } - - return Eden_Authorizenet_Server::i($apiLogin, $transactionKey, $certificate, $live = false); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/curl.php'; +require_once dirname(__FILE__).'/authorizenet/error.php'; +require_once dirname(__FILE__).'/authorizenet/base.php'; +require_once dirname(__FILE__).'/authorizenet/customer.php'; +require_once dirname(__FILE__).'/authorizenet/direct.php'; +require_once dirname(__FILE__).'/authorizenet/payment.php'; +require_once dirname(__FILE__).'/authorizenet/recurring.php'; +require_once dirname(__FILE__).'/authorizenet/server.php'; + +/** + * Authorize.net API factory. This is a factory class with + * methods that will load up different Authorize.net classes. + * Authorize.net classes are organized as described on their + * developer site: customer integration, direct post, advance + * integration, authomated recurring and server integration method + * + * @package Eden + * @category Authorize.net + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Authorizenet extends Eden_Class { + /* Constants + -------------------------------*/ + const PEM = '/authorizenet/cert.pem'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /** + * Returns authorize.net customer integration method + * + * @param *string API login key + * @param *string API transaction key + * @param *string API signature + * @param *boolean Live mode + * @return Eden_Authorizenet_Customer + */ + public function customer($apiLogin, $transactionKey, $live = false, $certificate = NULL) { + if(!is_string($certificate)) { + $certificate = dirname(__FILE__).self::PEM; + } + + return Eden_Authorizenet_Customer::i($apiLogin, $transactionKey, $certificate, $live); + } + + /** + * Returns authorize.net direct post method + * + * @param *string API login key + * @param *string API transaction key + * @param *string API signature + * @param *boolean Live mode + * @return Eden_Authorizenet_Direct + */ + public function direct($apiLogin, $transactionKey, $live = false, $certificate = NULL) { + if(!is_string($certificate)) { + $certificate = dirname(__FILE__).self::PEM; + } + + return Eden_Authorizenet_Direct::i($apiLogin, $transactionKey, $certificate, $live); + } + + /** + * Returns authorize.net advance integration method + * + * @param *string API login key + * @param *string API transaction key + * @param *string API signature + * @param *boolean Live mode + * @return Eden_Authorizenet_Payment + */ + public function payment($apiLogin, $transactionKey, $live = false, $certificate = NULL) { + if(!is_string($certificate)) { + $certificate = dirname(__FILE__).self::PEM; + } + + return Eden_Authorizenet_Payment::i($apiLogin, $transactionKey, $certificate, $live = false); + } + + /** + * Returns authorize.net authomated recurring method + * + * @param *string API login key + * @param *string API transaction key + * @param *string API signature + * @param *boolean Live mode + * @return Eden_Authorizenet_Recurring + */ + public function recurring($apiLogin, $transactionKey, $live = false, $certificate = NULL) { + if(!is_string($certificate)) { + $certificate = dirname(__FILE__).self::PEM; + } + + return Eden_Authorizenet_Recurring::i($apiLogin, $transactionKey, $certificate, $live = false); + } + + /** + * Returns authorize.net server integration method + * + * @param *string API login key + * @param *string API transaction key + * @param *string API signature + * @param *boolean Live mode + * @return Eden_Authorizenet_Server + */ + public function server($apiLogin, $transactionKey, $live = false, $certificate = NULL) { + if(!is_string($certificate)) { + $certificate = dirname(__FILE__).self::PEM; + } + + return Eden_Authorizenet_Server::i($apiLogin, $transactionKey, $certificate, $live = false); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/authorizenet/base.php b/library/eden/authorizenet/base.php index fbf051a..b09d272 100644 --- a/library/eden/authorizenet/base.php +++ b/library/eden/authorizenet/base.php @@ -1,148 +1,148 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Authorize Base - Sends requests to the Authorize.Net gateways. - * - * @package Eden - * @category authorize.net - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Authorizenet_Base extends Eden_Class { - /* Constants - -------------------------------*/ - const LIVE_URL = 'https://secure.authorize.net/gateway/transact.dll'; - const TEST_URL = 'https://test.authorize.net/gateway/transact.dll'; - const LIVE_XML_URL = 'https://api.authorize.net/xml/v1/request.api'; - const TEST_XML_URL = 'https://apitest.authorize.net/xml/v1/request.api'; - const VERSION = '3.1'; - const XML = 'xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"'; - const MERCHANT = 'merchantAuthentication'; - const NAME = 'name'; - const KEY = 'transactionKey'; - const XMLNS = 'xmlns'; - const SCHEMA = 'AnetApi/xml/v1/schema/AnetApiSchema.xsd'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_xmlUrl = self::TEST_XML_URL; - protected $_url = self::TEST_URL; - protected $_isLive = false; - protected $_apiLogin = NULL; - protected $_transactionKey = NULL; - protected $_certificate = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public function __construct($apiLogin, $transactionKey, $certificate, $live = false){ - //Argument test - Eden_Authorizenet_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'bool'); //Argument 4 must ba a boolean - - $this->_isLive = $live; - $this->_time = time(); - $this->_sequence = '123'.$this->_time; - $this->_apiLogin = $apiLogin; - $this->_transactionKey = $transactionKey; - $this->_certificate = $certificate; - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - protected function _constructXml($requestType) { - $this->_xml = new SimpleXMLElement('<'.$requestType.'/>'); - $this->_xml->addAttribute(self::XMLNS, self::SCHEMA); - - $merchant = $this->_xml->addChild(self::MERCHANT); - $merchant->addChild(self::NAME,$this->_apiLogin); - $merchant->addChild(self::KEY, $this->_transactionKey); - - return $this; - } - - protected function _getFingerprint($amount){ - //Argument 1 must be an integer or float - Eden_Authorizenet_Error::i()->argument(1, 'float','int'); - - $signature = sprintf('%s^%s^%s^%s^', $this->_apiLogin, $this->_sequence, $this->_time, $amount); - - return hash_hmac('md5', $signature, $this->_transactionKey); - } - - protected function _process($xml) { - //Argument 1 must be a string - Eden_Authorizenet_Error::i()->argument(1, 'string'); - - //If it is in live mode - if($this->_isLive) { - $this->_xmlUrl = self::LIVE_XML_URL; - } - //Execute curl - $curl = Eden_Curl::i() - ->setUrl($this->_xmlUrl) - ->setPostFields($xml) - ->setHeader(false) - ->setTimeout(45) - ->verifyHost(true) - ->setHttpHeader(array('Content-Type: text/xml')) - ->verifyPeer(false) - ->setPost(true); - - //Close curl - $response = $curl->getResponse(); - //Replace all occurrences of the search - $responses = str_replace(self::XML, '', $response); - //Call SimpleXMLElement class - $xml = new SimpleXMLElement($responses); - - return array( - 'resultCode' => (string) $xml->messages->resultCode, - 'code' => (string) $xml->messages->message->code, - 'text' => (string) $xml->messages->message->text, - 'validation' => (string) $xml->validationDirectResponse, - 'directResponse' => (string) $xml->directResponse, - 'profileId' => (int) $xml->customerProfileId, - 'addressId' => (int) $xml->customerAddressId, - 'ids' => (int) $xml->ids, - 'paymentProfileId' => (int) $xml->customerPaymentProfileId); - } - - protected function _sendRequest($post){ - //Argument 1 must be a string - Eden_Authorizenet_Error::i()->argument(1, 'string'); - - //if it is in live mode - if($this->_isLive) { - $this->_url = self::LIVE_URL; - } - //Execute curl - $curl = Eden_Curl::i() - ->setUrl($this->_url) - ->setPostFields($post) - ->setHeader(false) - ->setTimeout(45) - ->verifyHost(true) - ->setCaInfo($this->_certificate) - ->setPost(true); - - return $curl->getResponse(); - } - - /* Private Methods - -------------------------------*/ -} + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Authorize Base - Sends requests to the Authorize.Net gateways. + * + * @package Eden + * @category authorize.net + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Authorizenet_Base extends Eden_Class { + /* Constants + -------------------------------*/ + const LIVE_URL = 'https://secure.authorize.net/gateway/transact.dll'; + const TEST_URL = 'https://test.authorize.net/gateway/transact.dll'; + const LIVE_XML_URL = 'https://api.authorize.net/xml/v1/request.api'; + const TEST_XML_URL = 'https://apitest.authorize.net/xml/v1/request.api'; + const VERSION = '3.1'; + const XML = 'xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"'; + const MERCHANT = 'merchantAuthentication'; + const NAME = 'name'; + const KEY = 'transactionKey'; + const XMLNS = 'xmlns'; + const SCHEMA = 'AnetApi/xml/v1/schema/AnetApiSchema.xsd'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_xmlUrl = self::TEST_XML_URL; + protected $_url = self::TEST_URL; + protected $_isLive = false; + protected $_apiLogin = NULL; + protected $_transactionKey = NULL; + protected $_certificate = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public function __construct($apiLogin, $transactionKey, $certificate, $live = false){ + //Argument test + Eden_Authorizenet_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'bool'); //Argument 4 must ba a boolean + + $this->_isLive = $live; + $this->_time = time(); + $this->_sequence = '123'.$this->_time; + $this->_apiLogin = $apiLogin; + $this->_transactionKey = $transactionKey; + $this->_certificate = $certificate; + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + protected function _constructXml($requestType) { + $this->_xml = new SimpleXMLElement('<'.$requestType.'/>'); + $this->_xml->addAttribute(self::XMLNS, self::SCHEMA); + + $merchant = $this->_xml->addChild(self::MERCHANT); + $merchant->addChild(self::NAME,$this->_apiLogin); + $merchant->addChild(self::KEY, $this->_transactionKey); + + return $this; + } + + protected function _getFingerprint($amount){ + //Argument 1 must be an integer or float + Eden_Authorizenet_Error::i()->argument(1, 'float','int'); + + $signature = sprintf('%s^%s^%s^%s^', $this->_apiLogin, $this->_sequence, $this->_time, $amount); + + return hash_hmac('md5', $signature, $this->_transactionKey); + } + + protected function _process($xml) { + //Argument 1 must be a string + Eden_Authorizenet_Error::i()->argument(1, 'string'); + + //If it is in live mode + if($this->_isLive) { + $this->_xmlUrl = self::LIVE_XML_URL; + } + //Execute curl + $curl = Eden_Curl::i() + ->setUrl($this->_xmlUrl) + ->setPostFields($xml) + ->setHeader(false) + ->setTimeout(45) + ->verifyHost(true) + ->setHttpHeader(array('Content-Type: text/xml')) + ->verifyPeer(false) + ->setPost(true); + + //Close curl + $response = $curl->getResponse(); + //Replace all occurrences of the search + $responses = str_replace(self::XML, '', $response); + //Call SimpleXMLElement class + $xml = new SimpleXMLElement($responses); + + return array( + 'resultCode' => (string) $xml->messages->resultCode, + 'code' => (string) $xml->messages->message->code, + 'text' => (string) $xml->messages->message->text, + 'validation' => (string) $xml->validationDirectResponse, + 'directResponse' => (string) $xml->directResponse, + 'profileId' => (int) $xml->customerProfileId, + 'addressId' => (int) $xml->customerAddressId, + 'ids' => (int) $xml->ids, + 'paymentProfileId' => (int) $xml->customerPaymentProfileId); + } + + protected function _sendRequest($post){ + //Argument 1 must be a string + Eden_Authorizenet_Error::i()->argument(1, 'string'); + + //if it is in live mode + if($this->_isLive) { + $this->_url = self::LIVE_URL; + } + //Execute curl + $curl = Eden_Curl::i() + ->setUrl($this->_url) + ->setPostFields($post) + ->setHeader(false) + ->setTimeout(45) + ->verifyHost(true) + ->setCaInfo($this->_certificate) + ->setPost(true); + + return $curl->getResponse(); + } + + /* Private Methods + -------------------------------*/ +} diff --git a/library/eden/authorizenet/cert.pem b/library/eden/authorizenet/cert.pem index b59fbb0..a6a8bab 100644 --- a/library/eden/authorizenet/cert.pem +++ b/library/eden/authorizenet/cert.pem @@ -1,253 +1,253 @@ ------BEGIN CERTIFICATE----- -MIIEYTCCA0mgAwIBAgIESyDOMjANBgkqhkiG9w0BAQUFADCBsTELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9ycGEgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDkgRW50cnVzdCwgSW5jLjEuMCwGA1UEAxMlRW50cnVzdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAtIEwxQzAeFw0xMDAzMzExNzA0MDBaFw0xMjAzMzAx -NzMzNTdaMIGVMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQG -A1UEBxMNTW91bnRhaW4gVmlldzEgMB4GA1UEChMXQ3liZXJzb3VyY2UgQ29ycG9y -YXRpb24xHTAbBgNVBAsTFFBsYXRpbnVtU1NMIFdpbGRjYXJkMRgwFgYDVQQDFA8q -LmF1dGhvcml6ZS5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOSIsv0X -OFMm2cV74o2jSF7zkNGeLHkPsI10xsFXTG1xqjzq4eImAReA3eIp1oHvLmji4kea -rmTbxoURYdsRsWkx61b2vDrKJwjGU+hPvTYna0M4I9fpDgmp7e/Q5TJBWqI7BX9N -2ccL95/2rV0g021JJhkqYMDFERTYRqkLFLfNAgMBAAGjggEdMIIBGTALBgNVHQ8E -BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwMwYDVR0fBCwwKjAooCagJIYiaHR0 -cDovL2NybC5lbnRydXN0Lm5ldC9sZXZlbDFjLmNybDAzBggrBgEFBQcBAQQnMCUw -IwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmVudHJ1c3QubmV0MEAGA1UdIAQ5MDcw -NQYJKoZIhvZ9B0sCMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5u -ZXQvcnBhMB8GA1UdIwQYMBaAFB7xq4kG+EkPATN37hR67hl8kyhNMB0GA1UdDgQW -BBQ/gzreJ5piCG2MLGy5XOBCVB9iTTAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBBQUA -A4IBAQCK6J1LZ3kGde6kzS4aGnPq5WUnJTdwB/ASIB15OOdK20Mdi7D0zF0Aevew -+f73shY3f7eozVmh8aCb7uDRojrBgLGdtj0vcRiqUm+e1LKf9p0XPdFMLGzh2E2W -+eLhBTMEYOgGPQDY/sf2MEKHRIgobccFI3LUUXylncY6+UKtUWJQ114duoZH0+o+ -RIlSRgGsGNYkWJ9+jeI6acvG15ahIzIfUx8m0vQp0Nri9/3p/HOezQjNdN0knTlR -pRbXZJ65zOig2wjt4an0OfYnOcqpJ/2yslCv0/jKwumHeygVt68l3J4rH7nUwUzs -B+JUkDiJgBD/+BFADuJkTJLMcn6t ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE8jCCA9qgAwIBAgIEOGPp/DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw0wOTEyMTAyMDQzNTRaFw0xOTEy -MTAyMTEzNTRaMIGxMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNRW50cnVzdCwgSW5j -LjE5MDcGA1UECxMwd3d3LmVudHJ1c3QubmV0L3JwYSBpcyBpbmNvcnBvcmF0ZWQg -YnkgcmVmZXJlbmNlMR8wHQYDVQQLExYoYykgMjAwOSBFbnRydXN0LCBJbmMuMS4w -LAYDVQQDEyVFbnRydXN0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gTDFDMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl6MtPJ7eBdoTwhGNnY7jf8dL -flqfs/9iq3PIKGu6EGSChxPNVxj/KM7A5g4GkVApg9Hywyrb2NtOBMwA64u2lty8 -qvpSdwTB2xnkrpz9PIsD7028GgNl+cGxP3KG8jiqGa4QiHgo2nXDPQKCApy5wWV3 -diRMmPdtMTj72/7bNwJ2oRiXpszeIAlJNiRpQvbkN2LxWW2pPO00nKOO29w61/cK -b+8u2NWTWnrtCElo4kHjWpDBhlX8UUOd4LLEZ7TLMjEl8FSfS9Fv29Td/K9ebHiQ -ld7KOki5eTybGdZ1BaD5iNfB6KUJ5BoV3IcjqrJ1jGMlh9j4PabCzGb/pWZoVQID -AQABo4IBCzCCAQcwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wMwYI -KwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5lbnRydXN0Lm5l -dDAyBgNVHR8EKzApMCegJaAjhiFodHRwOi8vY3JsLmVudHJ1c3QubmV0LzIwNDhj -YS5jcmwwOwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93 -d3cuZW50cnVzdC5uZXQvcnBhMB0GA1UdDgQWBBQe8auJBvhJDwEzd+4Ueu4ZfJMo -TTAfBgNVHSMEGDAWgBRV5IHREYC+2Im5CKMx+aEkCRa5cDANBgkqhkiG9w0BAQUF -AAOCAQEAB/ZfgoR/gEDHkDRGQiQDzi+ruoOeJXMN7awFacaH7aNc8lfBsUl2mk3y -P93kDv4LPrmY2TKVHTL0Ae6cyMjlP+BTdmL83attPZSQ8sCzPJgnNl4olyL8G0DT -Kw2ttVdt3w/jS+9zAhBl+hvQrDHV4w/oujIwg+5K0L/fIpB6vuw6G8RJBB3xroB3 -PEII26c7KKaAAQPmOaPr34BZG/MsvtxyRHmgbAelbU1EjkJoypR8Lja6hZ7NqsRe -PFS+/i/qaZ0cHimbltjI/lGQ8SSmkAaz8Cmi/3gud1xFIdlEADHzvjJP9QoyDfz8 -uhZ2VrLWSJLyi6Y+t6xcaeoLP2ZFuQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEnzCCBAigAwIBAgIERp6RGjANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wOTAz -MjMxNTE4MjdaFw0xOTAzMjMxNTQ4MjdaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5l -dDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5u -ZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -rU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3ed -Vc3kw37XamSrhRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4 -LeksyZB2ZnuU4q941mVTXTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5 -CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N -328mz8MYIWJmQ3DW1cAH4QIDAQABo4IBJzCCASMwDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdodHRw -Oi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vY3Js -LmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMDsGA1UdIAQ0MDIwMAYEVR0gADAoMCYG -CCsGAQUFBwIBFhpodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NQUzAdBgNVHQ4EFgQU -VeSB0RGAvtiJuQijMfmhJAkWuXAwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX -8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEFBQAD -gYEAj2WiMI4mq4rsNRaY6QPwjRdfvExsAvZ0UuDCxh/O8qYRDKixDk2Ei3E277M1 -RfPB+JbFi1WkzGuDFiAy2r77r5u3n+F+hJ+ePFCnP1zCvouGuAiS7vhCKw0T43aF -SApKv9ClOwqwVLht4wj5NI0LjosSzBcaM4eVyJ4K3FBTF3s= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDSTCCArKgAwIBAgIQfmO9EP9/fYY45sRzhqgfGzANBgkqhkiG9w0BAQUFADBM -MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg -THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wOTA0MDkwMDAwMDBaFw0x -MTA0MTEyMzU5NTlaMIGPMQswCQYDVQQGEwJVUzENMAsGA1UECBMEVXRhaDEWMBQG -A1UEBxMNQW1lcmljYW4gRm9yazEcMBoGA1UEChMTQXV0aG9yaXplLk5ldCBDb3Jw -LjEcMBoGA1UECxMTQVVUSE9SSVpFLk5FVCBDT1JQLjEdMBsGA1UEAxMUc2VjdXJl -LmF1dGhvcml6ZS5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAN0dh86L -70MHbun7wTNGV0pNXsnebt3z9mCpndLUiBp5J/b57hQO5/HvevkhkDyCrky/Dn7y -4SEJh6RHYuP4ZBk30DS8iH5dWCRHqSQgpMKhUl/+D7KHbVqgPzOpOR44TiSa1P5m -Fv0qicvRR3iwSK/6ESywNvEJk1iiYPnpnnlvAgMBAAGjgecwgeQwDAYDVR0TAQH/ -BAIwADA2BgNVHR8ELzAtMCugKaAnhiVodHRwOi8vY3JsLnRoYXd0ZS5jb20vVGhh -d3RlU0dDQ0EuY3JsMCgGA1UdJQQhMB8GCCsGAQUFBwMBBggrBgEFBQcDAgYJYIZI -AYb4QgQBMHIGCCsGAQUFBwEBBGYwZDAiBggrBgEFBQcwAYYWaHR0cDovL29jc3Au -dGhhd3RlLmNvbTA+BggrBgEFBQcwAoYyaHR0cDovL3d3dy50aGF3dGUuY29tL3Jl -cG9zaXRvcnkvVGhhd3RlX1NHQ19DQS5jcnQwDQYJKoZIhvcNAQEFBQADgYEARa0l -PaGn4TOw3KOMVu8eiSdho4Nmal6u9AWE3rWHDakO2/a1AkZTM2/Wpt6KI3fp6WWK -LSsa9wLoVYSJ6pI7bmiJTvyx42yPP0PZXQSz05PHgTEGyW2jAn4N1hFvbTj28mZT -jv2jd12xgrmX34nulLdydNaM8J7CauhMvqwwvZ0= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIzCCAoygAwIBAgIEMAAAAjANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLkNsYXNzIDMgUHVi -bGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNTEzMDAw -MDAwWhcNMTQwNTEyMjM1OTU5WjBMMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhh -d3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBD -QTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1NNn0I0Vf67NMf59HZGhPwtx -PKzMyGT7Y/wySweUvW+Aui/hBJPAM/wJMyPpC3QrccQDxtLN4i/1CWPN/0ilAL/g -5/OIty0y3pg25gqtAHvEZEo7hHUD8nCSfQ5i9SGraTaEMXWQ+L/HbIgbBpV8yeWo -3nWhLHpo39XKHIdYYBkCAwEAAaOB/jCB+zASBgNVHRMBAf8ECDAGAQH/AgEAMAsG -A1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAQYwKAYDVR0RBCEwH6QdMBsxGTAX -BgNVBAMTEFByaXZhdGVMYWJlbDMtMTUwMQYDVR0fBCowKDAmoCSgIoYgaHR0cDov -L2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwMgYIKwYBBQUHAQEEJjAkMCIGCCsG -AQUFBzABhhZodHRwOi8vb2NzcC50aGF3dGUuY29tMDQGA1UdJQQtMCsGCCsGAQUF -BwMBBggrBgEFBQcDAgYJYIZIAYb4QgQBBgpghkgBhvhFAQgBMA0GCSqGSIb3DQEB -BQUAA4GBAFWsY+reod3SkF+fC852vhNRj5PZBSvIG3dLrWlQoe7e3P3bB+noOZTc -q3J5Lwa/q4FwxKjt6lM07e8eU9kGx1Yr0Vz00YqOtCuxN5BICEIlxT6Ky3/rbwTR -bcV0oveifHtgPHfNDs5IAn8BL7abN+AqKjbc1YXWrOU/VG+WHgWv ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFCjCCA/KgAwIBAgIERWua3DANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA5MTIxMDIwNTU0M1oXDTE5MTIxMDIx -MjU0M1owgbExCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvcnBhIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA5IEVudHJ1c3QsIEluYy4xLjAsBgNV -BAMTJUVudHJ1c3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBMMUUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2WwRUd90OJGbcKqHbgMxdx1/9UhZY -2l+UBqm4trljDEcgguzHlU6LuHdSaj21h6nW4cx05abIwNRWT40u1gg+DExDPvBB -k15G7znn2WUqDHZQJ71bDTMzB+D3oqmc4REzrWb80ix6qqNzFr6ThXUP1zeM+iO3 -ZPjjTG7tswW94jbbfN52RNqCcna2bv+UodCG9xDNSlqLsHWMZlKATkhMSYOmQNd3 -gRNNXnJ+SEYiqg/iPmWUOOFycf5KcQm6NX9ViT2B1bgoARB3NloQhdK9YIQrSWGU -DN5MQGoqxHlghCSCMmlKmEviVhC6A0VRINPP2o5UG0W2erqXmlrYxtFfAgMBAAGj -ggEnMIIBIzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAzBggrBgEF -BQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmVudHJ1c3QubmV0MDMG -A1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvcm9vdGNhMS5j -cmwwOwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cu -ZW50cnVzdC5uZXQvQ1BTMB0GA1UdDgQWBBRbQYqyxEPBvb/IVEFVneCWrf+5oTAf -BgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAZBgkqhkiG9n0HQQAEDDAK -GwRWNy4xAwIAgTANBgkqhkiG9w0BAQUFAAOCAQEAsjvSnsG8O0i23NhaGGZTw701 -DUhCLDUB2BCi4uONLLqmAxHta7FJy1/N7GCzutQC62FPTn7435BfTtOQAhxS2hIA -L5tx2gQSFMGQgy4o0hBAEYsmLeuZVVRvYI7Fgx3Aoz/VihQ5ahsN79NadznPabS9 -aW9PeNOhhqObt9f7qi3w+iah+WcsiEulNNWD+0zxW3AiZhubWU9NzpjbQaT+GqPr -OOb58TkCnUa2ycKePoK2H5/KSqixBl8QNDv92nusM07tprdL85H1nAsRktwTasjV -8TttlmsB5CNMscHg0hIhnynUrZU9pvfnMsV1twtX2KT5wOzsMjMMTa7oCNXsqg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEmzCCBASgAwIBAgIEQoctTDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzAx -MDUxOTIwMzlaFw0xNzAxMDUxOTUwMzlaMIGwMQswCQYDVQQGEwJVUzEWMBQGA1UE -ChMNRW50cnVzdCwgSW5jLjE5MDcGA1UECxMwd3d3LmVudHJ1c3QubmV0L0NQUyBp -cyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNlMR8wHQYDVQQLExYoYykgMjAwNiBF -bnRydXN0LCBJbmMuMS0wKwYDVQQDEyRFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2lbZD -QvrGbSpvSN+UTDlXBe7DeRFBaDbt7P6aAY+hOCj89xBGZi5NHhqxGk7G0cCViLDJ -/zGLMwPbt4N7PiCEXu2yViin+OC5QHE3xctHDpcqaMAilWIV20fZ9dAr/4JLya0+ -3kzbkIBQPwmKhADsMAo9GM37/SpZmiOVFyxFnh9uQ3ltDFyY/kinxSNHXF79buce -tPZoRdGGg1uiio2x4ymA/iVxiK2+vI+sUpZLqlGN5BMxGehOTZ/brLNq1bw5VHHK -enp/kN19HYDZgbtZJsIR/uaT4veA5GX7NDcOKYBwTa84hi6ef1evnheu6xzLKCFf -thzY56IEIvnT2tjLAgMBAAGjggEnMIIBIzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9v -Y3NwLmVudHJ1c3QubmV0MDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZW50 -cnVzdC5uZXQvc2VydmVyMS5jcmwwOwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYB -BQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvQ1BTMB0GA1UdDgQWBBRokORn -pKZTgMeGZqTx90tD+4S9bTAfBgNVHSMEGDAWgBTwF2ITVT2z/woAa/tQhJfz7WLQ -GjAZBgkqhkiG9n0HQQAEDDAKGwRWNy4xAwIAgTANBgkqhkiG9w0BAQUFAAOBgQAM -sIR8LRP+mj2/GAWVPSBIoxaBhxVQFaSIjZ9g1Dpv6y1uOoakqdLBnYl6CBykLbNH -jg9kSm9mA4M/TzSUNqopbYuNAiIrjM13pXCVhpHRtr9SvjNqa5n5b+ESvgTLM7/1 -EhpORLpbFk0wufO0dM5u8mhWWN3Yof1UBfQjkYXJ+Q== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFdDCCBFygAwIBAgIETCA3bTANBgkqhkiG9w0BAQUFADCBsTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5l -bnRydXN0Lm5ldC9ycGEgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEf -MB0GA1UECxMWKGMpIDIwMDkgRW50cnVzdCwgSW5jLjEuMCwGA1UEAxMlRW50 -cnVzdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEwxRTAeFw0xMTAzMjMx -NjQ4MzhaFw0xMzAzMjIyMzE4MDFaMIH4MQswCQYDVQQGEwJVUzETMBEGA1UE -CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzETMBEGCysG -AQQBgjc8AgEDEwJVUzEZMBcGCysGAQQBgjc8AgECEwhEZWxhd2FyZTEgMB4G -A1UEChMXQ3liZXJzb3VyY2UgQ29ycG9yYXRpb24xHTAbBgNVBA8TFFByaXZh -dGUgT3JnYW5pemF0aW9uMRwwGgYDVQQLExNBVVRIT1JJWkUuTkVUIENPUlAu -MS0wDgYDVQQFEwcyODM4OTIxMBsGA1UEAxMUc2VjdXJlLmF1dGhvcml6ZS5u -ZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvrwbLk7kDJnja -13i9lcXhYlHIwCTKHegPRuAkGDO6hNH0yNVv10kQSWjKhZ6KnoEA2p0F92FN -HwFTUfm0QGlaXW9kPc8nUi94hgY05iYwh96FHNdibqeO2r73GGol/RJkUO69 -ekqP1f+ABi7qWguL29cadX1DmOVQSkIeWc0xn9IVgS8dxnDzKwJ+41M5gLfM -YAJQ/FOwjOpt0j/Kg+38iHZ71FM7ehceYFggn+7y0ZcAcDUx4l6sKBuqFXq7 -viMqP2/Np0TpzmJMi2X8Wy0FDYoilHb9qBJWkl2AYxfjLTTSu27OMAJYyvEM -RmjOkLn7hQBPoSE6u3UKevtF2WPtAgMBAAGjggFJMIIBRTALBgNVHQ8EBAMC -BaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDMGCCsGAQUFBwEB -BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYD -VR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5lbnRydXN0Lm5ldC9sZXZlbDFl -LmNybDBBBgNVHSAEOjA4MDYGCmCGSAGG+mwKAQIwKDAmBggrBgEFBQcCARYa -aHR0cDovL3d3dy5lbnRydXN0Lm5ldC9ycGEwHwYDVR0RBBgwFoIUc2VjdXJl -LmF1dGhvcml6ZS5uZXQwHwYDVR0jBBgwFoAUW0GKssRDwb2/yFRBVZ3glq3/ -uaEwHQYDVR0OBBYEFGZazQ8qcWqAiT+oFpV/D7WTbcGlMAkGA1UdEwQCMAAw -DQYJKoZIhvcNAQEFBQADggEBAEG1lvV2JQXDXRmEXkDp5qpF6uj1eNfffViE -QR6XCLPWIuaEcgnieTfFzRPEYbxzUY9jCqM62U37hUTDdMKjZas7fwaZ8RjE -wQASNPrIsHFsXEb0Nbz58g3cY00teCH3qQ9N9uW3TC+OXiSz9aSBxYkHD/63 -2D1rzaZLVHXUoReMMbjwf69zLDN7qsy6VDksHMVjqQugZF0ZCLFPPH5jfdAx -sOtocx7eyUovzO387ve8UMTdw6Anr9Ai7iVaYf4MpMqcuaHVet3QeE97Koy1 -mT3q9FmUGbXM+nCqSs/TQ4jSqOo4zqDnkK/cOgbzjsuJJZ/rCPSxaKvz3b/n -wMWH7kM= +-----BEGIN CERTIFICATE----- +MIIEYTCCA0mgAwIBAgIESyDOMjANBgkqhkiG9w0BAQUFADCBsTELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9ycGEgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDkgRW50cnVzdCwgSW5jLjEuMCwGA1UEAxMlRW50cnVzdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAtIEwxQzAeFw0xMDAzMzExNzA0MDBaFw0xMjAzMzAx +NzMzNTdaMIGVMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQG +A1UEBxMNTW91bnRhaW4gVmlldzEgMB4GA1UEChMXQ3liZXJzb3VyY2UgQ29ycG9y +YXRpb24xHTAbBgNVBAsTFFBsYXRpbnVtU1NMIFdpbGRjYXJkMRgwFgYDVQQDFA8q +LmF1dGhvcml6ZS5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOSIsv0X +OFMm2cV74o2jSF7zkNGeLHkPsI10xsFXTG1xqjzq4eImAReA3eIp1oHvLmji4kea +rmTbxoURYdsRsWkx61b2vDrKJwjGU+hPvTYna0M4I9fpDgmp7e/Q5TJBWqI7BX9N +2ccL95/2rV0g021JJhkqYMDFERTYRqkLFLfNAgMBAAGjggEdMIIBGTALBgNVHQ8E +BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwMwYDVR0fBCwwKjAooCagJIYiaHR0 +cDovL2NybC5lbnRydXN0Lm5ldC9sZXZlbDFjLmNybDAzBggrBgEFBQcBAQQnMCUw +IwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmVudHJ1c3QubmV0MEAGA1UdIAQ5MDcw +NQYJKoZIhvZ9B0sCMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5u +ZXQvcnBhMB8GA1UdIwQYMBaAFB7xq4kG+EkPATN37hR67hl8kyhNMB0GA1UdDgQW +BBQ/gzreJ5piCG2MLGy5XOBCVB9iTTAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBBQUA +A4IBAQCK6J1LZ3kGde6kzS4aGnPq5WUnJTdwB/ASIB15OOdK20Mdi7D0zF0Aevew ++f73shY3f7eozVmh8aCb7uDRojrBgLGdtj0vcRiqUm+e1LKf9p0XPdFMLGzh2E2W ++eLhBTMEYOgGPQDY/sf2MEKHRIgobccFI3LUUXylncY6+UKtUWJQ114duoZH0+o+ +RIlSRgGsGNYkWJ9+jeI6acvG15ahIzIfUx8m0vQp0Nri9/3p/HOezQjNdN0knTlR +pRbXZJ65zOig2wjt4an0OfYnOcqpJ/2yslCv0/jKwumHeygVt68l3J4rH7nUwUzs +B+JUkDiJgBD/+BFADuJkTJLMcn6t +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE8jCCA9qgAwIBAgIEOGPp/DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw0wOTEyMTAyMDQzNTRaFw0xOTEy +MTAyMTEzNTRaMIGxMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNRW50cnVzdCwgSW5j +LjE5MDcGA1UECxMwd3d3LmVudHJ1c3QubmV0L3JwYSBpcyBpbmNvcnBvcmF0ZWQg +YnkgcmVmZXJlbmNlMR8wHQYDVQQLExYoYykgMjAwOSBFbnRydXN0LCBJbmMuMS4w +LAYDVQQDEyVFbnRydXN0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gTDFDMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl6MtPJ7eBdoTwhGNnY7jf8dL +flqfs/9iq3PIKGu6EGSChxPNVxj/KM7A5g4GkVApg9Hywyrb2NtOBMwA64u2lty8 +qvpSdwTB2xnkrpz9PIsD7028GgNl+cGxP3KG8jiqGa4QiHgo2nXDPQKCApy5wWV3 +diRMmPdtMTj72/7bNwJ2oRiXpszeIAlJNiRpQvbkN2LxWW2pPO00nKOO29w61/cK +b+8u2NWTWnrtCElo4kHjWpDBhlX8UUOd4LLEZ7TLMjEl8FSfS9Fv29Td/K9ebHiQ +ld7KOki5eTybGdZ1BaD5iNfB6KUJ5BoV3IcjqrJ1jGMlh9j4PabCzGb/pWZoVQID +AQABo4IBCzCCAQcwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wMwYI +KwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5lbnRydXN0Lm5l +dDAyBgNVHR8EKzApMCegJaAjhiFodHRwOi8vY3JsLmVudHJ1c3QubmV0LzIwNDhj +YS5jcmwwOwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93 +d3cuZW50cnVzdC5uZXQvcnBhMB0GA1UdDgQWBBQe8auJBvhJDwEzd+4Ueu4ZfJMo +TTAfBgNVHSMEGDAWgBRV5IHREYC+2Im5CKMx+aEkCRa5cDANBgkqhkiG9w0BAQUF +AAOCAQEAB/ZfgoR/gEDHkDRGQiQDzi+ruoOeJXMN7awFacaH7aNc8lfBsUl2mk3y +P93kDv4LPrmY2TKVHTL0Ae6cyMjlP+BTdmL83attPZSQ8sCzPJgnNl4olyL8G0DT +Kw2ttVdt3w/jS+9zAhBl+hvQrDHV4w/oujIwg+5K0L/fIpB6vuw6G8RJBB3xroB3 +PEII26c7KKaAAQPmOaPr34BZG/MsvtxyRHmgbAelbU1EjkJoypR8Lja6hZ7NqsRe +PFS+/i/qaZ0cHimbltjI/lGQ8SSmkAaz8Cmi/3gud1xFIdlEADHzvjJP9QoyDfz8 +uhZ2VrLWSJLyi6Y+t6xcaeoLP2ZFuQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEnzCCBAigAwIBAgIERp6RGjANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wOTAz +MjMxNTE4MjdaFw0xOTAzMjMxNTQ4MjdaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5l +dDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5u +ZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +rU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3ed +Vc3kw37XamSrhRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4 +LeksyZB2ZnuU4q941mVTXTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5 +CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N +328mz8MYIWJmQ3DW1cAH4QIDAQABo4IBJzCCASMwDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdodHRw +Oi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vY3Js +LmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMDsGA1UdIAQ0MDIwMAYEVR0gADAoMCYG +CCsGAQUFBwIBFhpodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NQUzAdBgNVHQ4EFgQU +VeSB0RGAvtiJuQijMfmhJAkWuXAwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX +8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEFBQAD +gYEAj2WiMI4mq4rsNRaY6QPwjRdfvExsAvZ0UuDCxh/O8qYRDKixDk2Ei3E277M1 +RfPB+JbFi1WkzGuDFiAy2r77r5u3n+F+hJ+ePFCnP1zCvouGuAiS7vhCKw0T43aF +SApKv9ClOwqwVLht4wj5NI0LjosSzBcaM4eVyJ4K3FBTF3s= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDSTCCArKgAwIBAgIQfmO9EP9/fYY45sRzhqgfGzANBgkqhkiG9w0BAQUFADBM +MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg +THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wOTA0MDkwMDAwMDBaFw0x +MTA0MTEyMzU5NTlaMIGPMQswCQYDVQQGEwJVUzENMAsGA1UECBMEVXRhaDEWMBQG +A1UEBxMNQW1lcmljYW4gRm9yazEcMBoGA1UEChMTQXV0aG9yaXplLk5ldCBDb3Jw +LjEcMBoGA1UECxMTQVVUSE9SSVpFLk5FVCBDT1JQLjEdMBsGA1UEAxMUc2VjdXJl +LmF1dGhvcml6ZS5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAN0dh86L +70MHbun7wTNGV0pNXsnebt3z9mCpndLUiBp5J/b57hQO5/HvevkhkDyCrky/Dn7y +4SEJh6RHYuP4ZBk30DS8iH5dWCRHqSQgpMKhUl/+D7KHbVqgPzOpOR44TiSa1P5m +Fv0qicvRR3iwSK/6ESywNvEJk1iiYPnpnnlvAgMBAAGjgecwgeQwDAYDVR0TAQH/ +BAIwADA2BgNVHR8ELzAtMCugKaAnhiVodHRwOi8vY3JsLnRoYXd0ZS5jb20vVGhh +d3RlU0dDQ0EuY3JsMCgGA1UdJQQhMB8GCCsGAQUFBwMBBggrBgEFBQcDAgYJYIZI +AYb4QgQBMHIGCCsGAQUFBwEBBGYwZDAiBggrBgEFBQcwAYYWaHR0cDovL29jc3Au +dGhhd3RlLmNvbTA+BggrBgEFBQcwAoYyaHR0cDovL3d3dy50aGF3dGUuY29tL3Jl +cG9zaXRvcnkvVGhhd3RlX1NHQ19DQS5jcnQwDQYJKoZIhvcNAQEFBQADgYEARa0l +PaGn4TOw3KOMVu8eiSdho4Nmal6u9AWE3rWHDakO2/a1AkZTM2/Wpt6KI3fp6WWK +LSsa9wLoVYSJ6pI7bmiJTvyx42yPP0PZXQSz05PHgTEGyW2jAn4N1hFvbTj28mZT +jv2jd12xgrmX34nulLdydNaM8J7CauhMvqwwvZ0= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIzCCAoygAwIBAgIEMAAAAjANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLkNsYXNzIDMgUHVi +bGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNTEzMDAw +MDAwWhcNMTQwNTEyMjM1OTU5WjBMMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhh +d3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBD +QTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1NNn0I0Vf67NMf59HZGhPwtx +PKzMyGT7Y/wySweUvW+Aui/hBJPAM/wJMyPpC3QrccQDxtLN4i/1CWPN/0ilAL/g +5/OIty0y3pg25gqtAHvEZEo7hHUD8nCSfQ5i9SGraTaEMXWQ+L/HbIgbBpV8yeWo +3nWhLHpo39XKHIdYYBkCAwEAAaOB/jCB+zASBgNVHRMBAf8ECDAGAQH/AgEAMAsG +A1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAQYwKAYDVR0RBCEwH6QdMBsxGTAX +BgNVBAMTEFByaXZhdGVMYWJlbDMtMTUwMQYDVR0fBCowKDAmoCSgIoYgaHR0cDov +L2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwMgYIKwYBBQUHAQEEJjAkMCIGCCsG +AQUFBzABhhZodHRwOi8vb2NzcC50aGF3dGUuY29tMDQGA1UdJQQtMCsGCCsGAQUF +BwMBBggrBgEFBQcDAgYJYIZIAYb4QgQBBgpghkgBhvhFAQgBMA0GCSqGSIb3DQEB +BQUAA4GBAFWsY+reod3SkF+fC852vhNRj5PZBSvIG3dLrWlQoe7e3P3bB+noOZTc +q3J5Lwa/q4FwxKjt6lM07e8eU9kGx1Yr0Vz00YqOtCuxN5BICEIlxT6Ky3/rbwTR +bcV0oveifHtgPHfNDs5IAn8BL7abN+AqKjbc1YXWrOU/VG+WHgWv +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFCjCCA/KgAwIBAgIERWua3DANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA5MTIxMDIwNTU0M1oXDTE5MTIxMDIx +MjU0M1owgbExCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvcnBhIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA5IEVudHJ1c3QsIEluYy4xLjAsBgNV +BAMTJUVudHJ1c3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBMMUUwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2WwRUd90OJGbcKqHbgMxdx1/9UhZY +2l+UBqm4trljDEcgguzHlU6LuHdSaj21h6nW4cx05abIwNRWT40u1gg+DExDPvBB +k15G7znn2WUqDHZQJ71bDTMzB+D3oqmc4REzrWb80ix6qqNzFr6ThXUP1zeM+iO3 +ZPjjTG7tswW94jbbfN52RNqCcna2bv+UodCG9xDNSlqLsHWMZlKATkhMSYOmQNd3 +gRNNXnJ+SEYiqg/iPmWUOOFycf5KcQm6NX9ViT2B1bgoARB3NloQhdK9YIQrSWGU +DN5MQGoqxHlghCSCMmlKmEviVhC6A0VRINPP2o5UG0W2erqXmlrYxtFfAgMBAAGj +ggEnMIIBIzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAzBggrBgEF +BQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmVudHJ1c3QubmV0MDMG +A1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvcm9vdGNhMS5j +cmwwOwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cu +ZW50cnVzdC5uZXQvQ1BTMB0GA1UdDgQWBBRbQYqyxEPBvb/IVEFVneCWrf+5oTAf +BgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAZBgkqhkiG9n0HQQAEDDAK +GwRWNy4xAwIAgTANBgkqhkiG9w0BAQUFAAOCAQEAsjvSnsG8O0i23NhaGGZTw701 +DUhCLDUB2BCi4uONLLqmAxHta7FJy1/N7GCzutQC62FPTn7435BfTtOQAhxS2hIA +L5tx2gQSFMGQgy4o0hBAEYsmLeuZVVRvYI7Fgx3Aoz/VihQ5ahsN79NadznPabS9 +aW9PeNOhhqObt9f7qi3w+iah+WcsiEulNNWD+0zxW3AiZhubWU9NzpjbQaT+GqPr +OOb58TkCnUa2ycKePoK2H5/KSqixBl8QNDv92nusM07tprdL85H1nAsRktwTasjV +8TttlmsB5CNMscHg0hIhnynUrZU9pvfnMsV1twtX2KT5wOzsMjMMTa7oCNXsqg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEmzCCBASgAwIBAgIEQoctTDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzAx +MDUxOTIwMzlaFw0xNzAxMDUxOTUwMzlaMIGwMQswCQYDVQQGEwJVUzEWMBQGA1UE +ChMNRW50cnVzdCwgSW5jLjE5MDcGA1UECxMwd3d3LmVudHJ1c3QubmV0L0NQUyBp +cyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNlMR8wHQYDVQQLExYoYykgMjAwNiBF +bnRydXN0LCBJbmMuMS0wKwYDVQQDEyRFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2lbZD +QvrGbSpvSN+UTDlXBe7DeRFBaDbt7P6aAY+hOCj89xBGZi5NHhqxGk7G0cCViLDJ +/zGLMwPbt4N7PiCEXu2yViin+OC5QHE3xctHDpcqaMAilWIV20fZ9dAr/4JLya0+ +3kzbkIBQPwmKhADsMAo9GM37/SpZmiOVFyxFnh9uQ3ltDFyY/kinxSNHXF79buce +tPZoRdGGg1uiio2x4ymA/iVxiK2+vI+sUpZLqlGN5BMxGehOTZ/brLNq1bw5VHHK +enp/kN19HYDZgbtZJsIR/uaT4veA5GX7NDcOKYBwTa84hi6ef1evnheu6xzLKCFf +thzY56IEIvnT2tjLAgMBAAGjggEnMIIBIzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9v +Y3NwLmVudHJ1c3QubmV0MDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZW50 +cnVzdC5uZXQvc2VydmVyMS5jcmwwOwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYB +BQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvQ1BTMB0GA1UdDgQWBBRokORn +pKZTgMeGZqTx90tD+4S9bTAfBgNVHSMEGDAWgBTwF2ITVT2z/woAa/tQhJfz7WLQ +GjAZBgkqhkiG9n0HQQAEDDAKGwRWNy4xAwIAgTANBgkqhkiG9w0BAQUFAAOBgQAM +sIR8LRP+mj2/GAWVPSBIoxaBhxVQFaSIjZ9g1Dpv6y1uOoakqdLBnYl6CBykLbNH +jg9kSm9mA4M/TzSUNqopbYuNAiIrjM13pXCVhpHRtr9SvjNqa5n5b+ESvgTLM7/1 +EhpORLpbFk0wufO0dM5u8mhWWN3Yof1UBfQjkYXJ+Q== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFdDCCBFygAwIBAgIETCA3bTANBgkqhkiG9w0BAQUFADCBsTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5l +bnRydXN0Lm5ldC9ycGEgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEf +MB0GA1UECxMWKGMpIDIwMDkgRW50cnVzdCwgSW5jLjEuMCwGA1UEAxMlRW50 +cnVzdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEwxRTAeFw0xMTAzMjMx +NjQ4MzhaFw0xMzAzMjIyMzE4MDFaMIH4MQswCQYDVQQGEwJVUzETMBEGA1UE +CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzETMBEGCysG +AQQBgjc8AgEDEwJVUzEZMBcGCysGAQQBgjc8AgECEwhEZWxhd2FyZTEgMB4G +A1UEChMXQ3liZXJzb3VyY2UgQ29ycG9yYXRpb24xHTAbBgNVBA8TFFByaXZh +dGUgT3JnYW5pemF0aW9uMRwwGgYDVQQLExNBVVRIT1JJWkUuTkVUIENPUlAu +MS0wDgYDVQQFEwcyODM4OTIxMBsGA1UEAxMUc2VjdXJlLmF1dGhvcml6ZS5u +ZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvrwbLk7kDJnja +13i9lcXhYlHIwCTKHegPRuAkGDO6hNH0yNVv10kQSWjKhZ6KnoEA2p0F92FN +HwFTUfm0QGlaXW9kPc8nUi94hgY05iYwh96FHNdibqeO2r73GGol/RJkUO69 +ekqP1f+ABi7qWguL29cadX1DmOVQSkIeWc0xn9IVgS8dxnDzKwJ+41M5gLfM +YAJQ/FOwjOpt0j/Kg+38iHZ71FM7ehceYFggn+7y0ZcAcDUx4l6sKBuqFXq7 +viMqP2/Np0TpzmJMi2X8Wy0FDYoilHb9qBJWkl2AYxfjLTTSu27OMAJYyvEM +RmjOkLn7hQBPoSE6u3UKevtF2WPtAgMBAAGjggFJMIIBRTALBgNVHQ8EBAMC +BaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDMGCCsGAQUFBwEB +BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYD +VR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5lbnRydXN0Lm5ldC9sZXZlbDFl +LmNybDBBBgNVHSAEOjA4MDYGCmCGSAGG+mwKAQIwKDAmBggrBgEFBQcCARYa +aHR0cDovL3d3dy5lbnRydXN0Lm5ldC9ycGEwHwYDVR0RBBgwFoIUc2VjdXJl +LmF1dGhvcml6ZS5uZXQwHwYDVR0jBBgwFoAUW0GKssRDwb2/yFRBVZ3glq3/ +uaEwHQYDVR0OBBYEFGZazQ8qcWqAiT+oFpV/D7WTbcGlMAkGA1UdEwQCMAAw +DQYJKoZIhvcNAQEFBQADggEBAEG1lvV2JQXDXRmEXkDp5qpF6uj1eNfffViE +QR6XCLPWIuaEcgnieTfFzRPEYbxzUY9jCqM62U37hUTDdMKjZas7fwaZ8RjE +wQASNPrIsHFsXEb0Nbz58g3cY00teCH3qQ9N9uW3TC+OXiSz9aSBxYkHD/63 +2D1rzaZLVHXUoReMMbjwf69zLDN7qsy6VDksHMVjqQugZF0ZCLFPPH5jfdAx +sOtocx7eyUovzO387ve8UMTdw6Anr9Ai7iVaYf4MpMqcuaHVet3QeE97Koy1 +mT3q9FmUGbXM+nCqSs/TQ4jSqOo4zqDnkK/cOgbzjsuJJZ/rCPSxaKvz3b/n +wMWH7kM= -----END CERTIFICATE----- \ No newline at end of file diff --git a/library/eden/authorizenet/direct.php b/library/eden/authorizenet/direct.php index 7e51aad..ab19a9f 100644 --- a/library/eden/authorizenet/direct.php +++ b/library/eden/authorizenet/direct.php @@ -1,106 +1,106 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Authorize.net - Direct Post Method - * - * @package Eden - * @category authorize.net - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Authorizenet_Direct extends Eden_Authorizenet_Base{ - /* Constants - -------------------------------*/ - const LIVE_URL = 'https://secure.authorize.net/gateway/transact.dll'; - const TEST_URL = 'https://test.authorize.net/gateway/transact.dll'; - - const AMOUNT = 'x_amount'; - const SEQUENCE = 'x_fp_sequence'; - const HASH = 'x_fp_hash'; - const TIMESTAMP = 'x_fp_timestamp'; - const RESPONSE = 'x_relay_response'; - const RELAY_URL = 'x_relay_url'; - const LOGIN = 'x_login'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_amount = 0; - protected $_returnUrl = NULL; - protected $_postUrl = self::TEST_URL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Set transaction amount - * - * @param *integer|float Transaction amount - * @return this - */ - public function setAmount($amount) { - //Argument 1 must be an integer or float - Eden_Authorizenet_Error::i()->argument(1, 'int', 'float'); - - $this->_amount = $amount; - return $this; - } - - /** - * Demonstrates the Direct Post Method - * - * return this - */ - public function getResponse(){ - //if it is in live mode - if($this->_isLive) { - $this->_postUrl = self::LIVE_URL; - } - - //Call get fingerprint method - $fingerPrint = $this->_getFingerprint($this->_amount); - - //Call block - return Eden_Authorizenet_Block_Post::i($this->_postUrl, array( - self::AMOUNT => $this->_amount, - self::SEQUENCE => $this->_sequence, - self::HASH => $fingerPrint, - self::TIMESTAMP => $this->_time, - self::RESPONSE => 'FALSE', - self::RELAY_URL => $this->_returnUrl, - self::LOGIN => $this->_apiLogin)); - } - - /** - * Set return URL - * - * @param *string - * @return this - */ - public function setReturnUrl($url) { - //Argument 1 must be a string - Eden_Authorizenet_Error::i()->argument(1, 'string'); - - $this->_returnUrl = $url; - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Authorize.net - Direct Post Method + * + * @package Eden + * @category authorize.net + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Authorizenet_Direct extends Eden_Authorizenet_Base{ + /* Constants + -------------------------------*/ + const LIVE_URL = 'https://secure.authorize.net/gateway/transact.dll'; + const TEST_URL = 'https://test.authorize.net/gateway/transact.dll'; + + const AMOUNT = 'x_amount'; + const SEQUENCE = 'x_fp_sequence'; + const HASH = 'x_fp_hash'; + const TIMESTAMP = 'x_fp_timestamp'; + const RESPONSE = 'x_relay_response'; + const RELAY_URL = 'x_relay_url'; + const LOGIN = 'x_login'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_amount = 0; + protected $_returnUrl = NULL; + protected $_postUrl = self::TEST_URL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Set transaction amount + * + * @param *integer|float Transaction amount + * @return this + */ + public function setAmount($amount) { + //Argument 1 must be an integer or float + Eden_Authorizenet_Error::i()->argument(1, 'int', 'float'); + + $this->_amount = $amount; + return $this; + } + + /** + * Demonstrates the Direct Post Method + * + * return this + */ + public function getResponse(){ + //if it is in live mode + if($this->_isLive) { + $this->_postUrl = self::LIVE_URL; + } + + //Call get fingerprint method + $fingerPrint = $this->_getFingerprint($this->_amount); + + //Call block + return Eden_Authorizenet_Block_Post::i($this->_postUrl, array( + self::AMOUNT => $this->_amount, + self::SEQUENCE => $this->_sequence, + self::HASH => $fingerPrint, + self::TIMESTAMP => $this->_time, + self::RESPONSE => 'FALSE', + self::RELAY_URL => $this->_returnUrl, + self::LOGIN => $this->_apiLogin)); + } + + /** + * Set return URL + * + * @param *string + * @return this + */ + public function setReturnUrl($url) { + //Argument 1 must be a string + Eden_Authorizenet_Error::i()->argument(1, 'string'); + + $this->_returnUrl = $url; + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/authorizenet/server.php b/library/eden/authorizenet/server.php index 31a9fe4..279050a 100644 --- a/library/eden/authorizenet/server.php +++ b/library/eden/authorizenet/server.php @@ -1,94 +1,94 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Authorize.net Server Integration Method - * - * @package Eden - * @category authorize.net - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Authorizenet_Server extends Eden_Authorizenet_Base{ - /* Constants - -------------------------------*/ - const LIVE_URL = 'https://secure.authorize.net/gateway/transact.dll'; - const TEST_URL = 'https://test.authorize.net/gateway/transact.dll'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_testMode = self::TEST_URL; - protected $_amount = NULL; - protected $_description = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Set the amount of the item - * - * @param *integer|float Amount of the item - * @return this - */ - public function setAmount($amount) { - //Argument 1 must be an integer or float - Eden_Paypal_Error::i()->argument(1, 'int', 'float'); - - $this->_amount = $amount; - return $this; - } - - /** - * Set item description - * - * @param *string Short description of the item - * @return this - */ - public function setDescription($description) { - //Argument 1 must be a string - Eden_Paypal_Error::i()->argument(1, 'string'); - - $this->_description = $description; - return $this; - } - - /** - * Provides a secure hosted payment form. - * - * @return this - */ - public function getResponse() { - //if it is in live mode - if($this->_isLive) { - $this->_testMode = self::LIVE_URL; - } - //Call get fingerprint method - $fingerprint = $this->_getFingerprint($this->_amount); - //Call block - return Eden_Authorizenet_Block_Confirm::i( - $this->_apiLogin, - $fingerprint, - $this->_amount, - $this->_description, - $this->_testMode); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Authorize.net Server Integration Method + * + * @package Eden + * @category authorize.net + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Authorizenet_Server extends Eden_Authorizenet_Base{ + /* Constants + -------------------------------*/ + const LIVE_URL = 'https://secure.authorize.net/gateway/transact.dll'; + const TEST_URL = 'https://test.authorize.net/gateway/transact.dll'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_testMode = self::TEST_URL; + protected $_amount = NULL; + protected $_description = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Set the amount of the item + * + * @param *integer|float Amount of the item + * @return this + */ + public function setAmount($amount) { + //Argument 1 must be an integer or float + Eden_Paypal_Error::i()->argument(1, 'int', 'float'); + + $this->_amount = $amount; + return $this; + } + + /** + * Set item description + * + * @param *string Short description of the item + * @return this + */ + public function setDescription($description) { + //Argument 1 must be a string + Eden_Paypal_Error::i()->argument(1, 'string'); + + $this->_description = $description; + return $this; + } + + /** + * Provides a secure hosted payment form. + * + * @return this + */ + public function getResponse() { + //if it is in live mode + if($this->_isLive) { + $this->_testMode = self::LIVE_URL; + } + //Call get fingerprint method + $fingerprint = $this->_getFingerprint($this->_amount); + //Call block + return Eden_Authorizenet_Block_Confirm::i( + $this->_apiLogin, + $fingerprint, + $this->_amount, + $this->_description, + $this->_testMode); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/cache.php b/library/eden/cache.php index 6d513d1..db43907 100755 --- a/library/eden/cache.php +++ b/library/eden/cache.php @@ -1,236 +1,236 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/file.php'; - -/** - * This class allows the use of setting up multiple file cache - * locations. A file cache is a collection of files with data - * that was previously computed. We cache when computing the - * same data is expensive on memory or time. Once the data is - * stored in the file cache, it can be used in the future by - * accessing the cached copy rather than recomputing the - * original data. - * - * @package Eden - * @category cache - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Cache extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_key = NULL; - protected $_path = NULL; - protected $_cache = array(); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($root, $key = 'key.php') { - Eden_Cache_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $this->setKey($key)->setRoot($root)->build(); - } - - /* Public Methods - -------------------------------*/ - /** - * Builds the cache into memory - * - * @return Eden_CacheModel - */ - public function build() { - try { - $this->_cache = Eden_File::i($this->_path.'/'.$this->_key)->getData(); - } catch(Eden_Path_Error $e) { - $this->_cache = array(); - } - return $this; - } - - /** - * Gets a data cache - * - * @param *string the key to the data - * @return mixed - */ - public function get($key, $default = NULL) { - //argument 1 must be a string - Eden_Cache_Error::i()->argument(1, 'string'); - - //if the key exists - if($this->keyExists($key)) { - //return it - return Eden_File::i($this->_cache[$key])->getData(); - } - - //return the defauit - return $default; - } - - /** - * Gets the unix time of when a cache has been created - * - * @param *string the key to the data - * @return int - */ - public function getCreated($key) { - //argument 1 must be a string - Eden_Cache_Error::i()->argument(1, 'string'); - - //if the key exists - if($this->keyExists($key)) { - //return it - return Eden_File::i($this->_cache[$key])->getTime(); - } - - return 0; - } - - /** - * returns a list of keys - * - * @return array - */ - public function getKeys() { - //return the defauit - return array_keys($this->_cache); - } - - /** - * Checks if a key is cached - * - * @param *string the key to the data - * @return bool - */ - public function keyExists($key) { - //argument 1 must be a string - Eden_Cache_Error::i()->argument(1, 'string'); - - return isset($this->_cache[$key]) && file_exists($this->_cache[$key]); - } - - /** - * Sets a data cache - * - * @param *string the key to the data - * @return this - */ - public function remove($key) { - //argument test - Eden_Cache_Error::i()->argument(1, 'string'); //argument 1 must be a string - - if(isset($this->_cache[$key])) { - unset($this->_cache[$key]); - } - - //now we want to store the key and data file correlation - Eden_File::i($this->_path.'/'.$this->_key)->setData($this->_cache); - - return $this; - } - - /** - * Sets a data cache - * - * @param *string the key to the data - * @param *string the path of the cache - * @param *mixed the data to be cached - * @return Eden_CacheModel - */ - public function set($key, $path, $data) { - //argument test - Eden_Cache_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string'); //argument 2 must be a string - - //get the proper path format - $path = $this->_path.Eden_Path::i($path); - //set the data to the file - Eden_File::i($path)->setData($data); - //store this data in memory by keyword - $this->_cache[$key] = $path; - //now we want to store the key and data file correlation - Eden_File::i($this->_path.'/'.$this->_key)->setData($this->_cache); - - return $this; - } - - /** - * Sets a cache key file - * - * @param *string the name of the key file - * @return Eden_CacheModel - */ - public function setKey($key) { - //argument 1 must be a string - Eden_Cache_Error::i()->argument(1, 'string'); - - $this->_key = $key; - return $this; - } - - /** - * Sets a cache path root - * - * @param string the root path - * @return Eden_CacheModel - */ - public function setRoot($root) { - //argument 1 must be a string - Eden_Cache_Error::i()->argument(1, 'string'); - - $this->_path = (string) Eden_Path::i($root)->absolute(); - - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ -} - -/** - * Cache Errors - */ -class Eden_Cache_Error extends Eden_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/file.php'; + +/** + * This class allows the use of setting up multiple file cache + * locations. A file cache is a collection of files with data + * that was previously computed. We cache when computing the + * same data is expensive on memory or time. Once the data is + * stored in the file cache, it can be used in the future by + * accessing the cached copy rather than recomputing the + * original data. + * + * @package Eden + * @category cache + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Cache extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_key = NULL; + protected $_path = NULL; + protected $_cache = array(); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($root, $key = 'key.php') { + Eden_Cache_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $this->setKey($key)->setRoot($root)->build(); + } + + /* Public Methods + -------------------------------*/ + /** + * Builds the cache into memory + * + * @return Eden_CacheModel + */ + public function build() { + try { + $this->_cache = Eden_File::i($this->_path.'/'.$this->_key)->getData(); + } catch(Eden_Path_Error $e) { + $this->_cache = array(); + } + return $this; + } + + /** + * Gets a data cache + * + * @param *string the key to the data + * @return mixed + */ + public function get($key, $default = NULL) { + //argument 1 must be a string + Eden_Cache_Error::i()->argument(1, 'string'); + + //if the key exists + if($this->keyExists($key)) { + //return it + return Eden_File::i($this->_cache[$key])->getData(); + } + + //return the defauit + return $default; + } + + /** + * Gets the unix time of when a cache has been created + * + * @param *string the key to the data + * @return int + */ + public function getCreated($key) { + //argument 1 must be a string + Eden_Cache_Error::i()->argument(1, 'string'); + + //if the key exists + if($this->keyExists($key)) { + //return it + return Eden_File::i($this->_cache[$key])->getTime(); + } + + return 0; + } + + /** + * returns a list of keys + * + * @return array + */ + public function getKeys() { + //return the defauit + return array_keys($this->_cache); + } + + /** + * Checks if a key is cached + * + * @param *string the key to the data + * @return bool + */ + public function keyExists($key) { + //argument 1 must be a string + Eden_Cache_Error::i()->argument(1, 'string'); + + return isset($this->_cache[$key]) && file_exists($this->_cache[$key]); + } + + /** + * Sets a data cache + * + * @param *string the key to the data + * @return this + */ + public function remove($key) { + //argument test + Eden_Cache_Error::i()->argument(1, 'string'); //argument 1 must be a string + + if(isset($this->_cache[$key])) { + unset($this->_cache[$key]); + } + + //now we want to store the key and data file correlation + Eden_File::i($this->_path.'/'.$this->_key)->setData($this->_cache); + + return $this; + } + + /** + * Sets a data cache + * + * @param *string the key to the data + * @param *string the path of the cache + * @param *mixed the data to be cached + * @return Eden_CacheModel + */ + public function set($key, $path, $data) { + //argument test + Eden_Cache_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string'); //argument 2 must be a string + + //get the proper path format + $path = $this->_path.Eden_Path::i($path); + //set the data to the file + Eden_File::i($path)->setData($data); + //store this data in memory by keyword + $this->_cache[$key] = $path; + //now we want to store the key and data file correlation + Eden_File::i($this->_path.'/'.$this->_key)->setData($this->_cache); + + return $this; + } + + /** + * Sets a cache key file + * + * @param *string the name of the key file + * @return Eden_CacheModel + */ + public function setKey($key) { + //argument 1 must be a string + Eden_Cache_Error::i()->argument(1, 'string'); + + $this->_key = $key; + return $this; + } + + /** + * Sets a cache path root + * + * @param string the root path + * @return Eden_CacheModel + */ + public function setRoot($root) { + //argument 1 must be a string + Eden_Cache_Error::i()->argument(1, 'string'); + + $this->_path = (string) Eden_Path::i($root)->absolute(); + + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ +} + +/** + * Cache Errors + */ +class Eden_Cache_Error extends Eden_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/class.php b/library/eden/class.php index 76ca644..08888f3 100755 --- a/library/eden/class.php +++ b/library/eden/class.php @@ -1,308 +1,308 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/error.php'; -require_once dirname(__FILE__).'/route.php'; - -require_once dirname(__FILE__).'/debug.php'; -require_once dirname(__FILE__).'/when.php'; -require_once dirname(__FILE__).'/loop.php'; - -/** - * The base class for all classes wishing to integrate with Eden. - * Extending this class will allow your methods to seemlessly be - * overloaded and overrided as well as provide some basic class - * loading patterns. - * - * @package Eden - * @category core - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Class { - /* Constants - -------------------------------*/ - const DEBUG = 'DEBUG %s:'; - const INSTANCE = 0; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - private static $_instances = array(); - - /* Magic - -------------------------------*/ - public static function i() { - if(static::INSTANCE === 1) { - return self::_getSingleton(); - } - - return self::_getMultiple(); - } - - public function __call($name, $args) { - //if the method name starts with a capital letter - //most likely they want a class - if(preg_match("/^[A-Z]/", $name)) { - //lets first consider that they may just - //want to load a class so lets try - try { - //return the class - return Eden_Route::i()->getClass($name, $args); - //only if there's a route exception do we want to catch it - //this is because a class can throw an exception in their construct - //so if that happens then we do know that the class has actually - //been called and an exception is suppose to happen - } catch(Eden_Route_Error $e) {} - } - - try { - //let the router handle this - return Eden_Route::i()->getMethod()->call($this, $name, $args); - } catch(Eden_Route_Error $e) { - Eden_Error::i($e->getMessage())->trigger(); - } - } - - public function __invoke() { - //if arguments are 0 - if(func_num_args() == 0) { - //return this - return $this; - } - - //get the arguments - $args = func_get_args(); - - //if the first argument is an array - if(is_array($args[0])) { - //make the args that - $args = $args[0]; - } - - //take our the class name - $class = array_shift($args); - //if this class does not start with Eden - if(strpos('Eden_', $class) !== 0) { - //add it - $class = 'Eden_'.$class; - } - - //try to - try { - //instantiate it - return Eden_Route::i()->getClass($class, $args); - } catch(Eden_Route_Error $e) { - //throw the error at this point - //to get rid of false positives - Eden_Error::i($e->getMessage())->trigger(); - } - } - - public function __toString() { - return get_class($this); - } - - /* Public Methods - -------------------------------*/ - /** - * Calls a method in this class and allows - * argumetns to be passed as an array - * - * @param string - * @param array - * @return mixed - */ - public function callThis($method, array $args = array()) { - //argument 1 must be a string - Eden_Error::i()->argument(1,'string'); - - return Eden_Route::i()->getMethod($this, $method, $args); - } - - /** - * Force outputs any class property - * - * @param string|null - * @param string|null - * @return this - */ - public function debug($variable = NULL, $next = NULL) { - //we are using tool in all cases - $class = get_class($this); - - //if variable is null - if(is_null($variable)) { - //output the class - Eden_Debug::i() - ->output(sprintf(self::DEBUG, $class)) - ->output($this); - - return $this; - } - - //if variable is true - if($variable === true) { - //return whatever the next response is - //or return the next specified variable - return Eden_Debug::i()->next($this, $next); - } - - //if variable is not a string - if(!is_string($variable)) { - //soft output error - Eden_Debug::i()->output(Eden_Error::DEBUG_NOT_STRING); - return $this; - } - - //if variable is set - if(isset($this->$variable)) { - //output it - Eden_Debug::i() - ->output(sprintf(self::DEBUG, $class.'->'.$variable)) - ->output($this->$variable); - - return $this; - } - - //could be private - $private = '_'.$variable; - //if private variable is set - if(isset($this->$private)) { - //output it - Eden_Debug::i() - ->output(sprintf(self::DEBUG, $class.'->'.$private)) - ->output($this->$private); - - return $this; - } - - //soft output error - Eden_Debug::i()->output(sprintf(Eden_Error::DEBUG_NOT_PROPERTY, $variable, $class)); - - return $this; - } - - /** - * Loops through returned result sets - * - * @param *callable - * @return this - */ - public function each($callback) { - Eden_Error::i()->argument(1, 'callable'); - return Eden_Loop::i()->iterate($this, $callback); - } - - /** - * Creates a class route for this class. - * - * @param *string the class route name - * @return Eden_Class - */ - public function routeThis($route) { - //argument 1 must be a string - Eden_Error::i()->argument(1, 'string'); - - if(func_num_args() == 1) { - //when someone calls a class call this instead - Eden_Route::i()->getClass()->route($route, $this); - return $this; - } - - //argument 2 must be a string - Eden_Error::i()->argument(2, 'string', 'object'); - - $args = func_get_args(); - - $source = array_shift($args); - $class = array_shift($args); - $destination = NULL; - - if(count($args)) { - $destination = array_shift($args); - } - - //when someone calls a method here call something ele instead - Eden_Route::i()->getMethod()->route($this, $source, $class, $destination); - return $this; - } - - /** - * Invokes When if conditional is false - * - * @param bool - * @return this|Eden_Noop - */ - public function when($isTrue, $lines = 0) { - if($isTrue) { - return $this; - } - - return Eden_When::i($this, $lines); - } - - /* Protected Methods - -------------------------------*/ - protected static function _getMultiple($class = NULL) { - if(is_null($class) && function_exists('get_called_class')) { - $class = get_called_class(); - } - - $class = Eden_Route::i()->getClass()->getRoute($class); - return self::_getInstance($class); - } - - protected static function _getSingleton($class = NULL) { - if(is_null($class) && function_exists('get_called_class')) { - $class = get_called_class(); - } - - $class = Eden_Route::i()->getClass()->getRoute($class); - - if(!isset(self::$_instances[$class])) { - self::$_instances[$class] = self::_getInstance($class); - } - - return self::$_instances[$class]; - } - - /* Private Methods - -------------------------------*/ - private static function _getInstance($class) { - $trace = debug_backtrace(); - $args = array(); - - if(isset($trace[1]['args']) && count($trace[1]['args']) > 1) { - $args = $trace[1]['args']; - //shift out the class name - array_shift($args); - } else if(isset($trace[2]['args']) && count($trace[2]['args']) > 0) { - $args = $trace[2]['args']; - } - - if(count($args) === 0 || !method_exists($class, '__construct')) { - return new $class; - } - - $reflect = new ReflectionClass($class); - - try { - return $reflect->newInstanceArgs($args); - } catch(Reflection_Exception $e) { - Eden_Error::i() - ->setMessage(Eden_Error::REFLECTION_ERROR) - ->addVariable($class) - ->addVariable('new') - ->trigger(); - } - } + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/error.php'; +require_once dirname(__FILE__).'/route.php'; + +require_once dirname(__FILE__).'/debug.php'; +require_once dirname(__FILE__).'/when.php'; +require_once dirname(__FILE__).'/loop.php'; + +/** + * The base class for all classes wishing to integrate with Eden. + * Extending this class will allow your methods to seemlessly be + * overloaded and overrided as well as provide some basic class + * loading patterns. + * + * @package Eden + * @category core + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Class { + /* Constants + -------------------------------*/ + const DEBUG = 'DEBUG %s:'; + const INSTANCE = 0; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + private static $_instances = array(); + + /* Magic + -------------------------------*/ + public static function i() { + if(static::INSTANCE === 1) { + return self::_getSingleton(); + } + + return self::_getMultiple(); + } + + public function __call($name, $args) { + //if the method name starts with a capital letter + //most likely they want a class + if(preg_match("/^[A-Z]/", $name)) { + //lets first consider that they may just + //want to load a class so lets try + try { + //return the class + return Eden_Route::i()->getClass($name, $args); + //only if there's a route exception do we want to catch it + //this is because a class can throw an exception in their construct + //so if that happens then we do know that the class has actually + //been called and an exception is suppose to happen + } catch(Eden_Route_Error $e) {} + } + + try { + //let the router handle this + return Eden_Route::i()->getMethod()->call($this, $name, $args); + } catch(Eden_Route_Error $e) { + Eden_Error::i($e->getMessage())->trigger(); + } + } + + public function __invoke() { + //if arguments are 0 + if(func_num_args() == 0) { + //return this + return $this; + } + + //get the arguments + $args = func_get_args(); + + //if the first argument is an array + if(is_array($args[0])) { + //make the args that + $args = $args[0]; + } + + //take our the class name + $class = array_shift($args); + //if this class does not start with Eden + if(strpos('Eden_', $class) !== 0) { + //add it + $class = 'Eden_'.$class; + } + + //try to + try { + //instantiate it + return Eden_Route::i()->getClass($class, $args); + } catch(Eden_Route_Error $e) { + //throw the error at this point + //to get rid of false positives + Eden_Error::i($e->getMessage())->trigger(); + } + } + + public function __toString() { + return get_class($this); + } + + /* Public Methods + -------------------------------*/ + /** + * Calls a method in this class and allows + * argumetns to be passed as an array + * + * @param string + * @param array + * @return mixed + */ + public function callThis($method, array $args = array()) { + //argument 1 must be a string + Eden_Error::i()->argument(1,'string'); + + return Eden_Route::i()->getMethod($this, $method, $args); + } + + /** + * Force outputs any class property + * + * @param string|null + * @param string|null + * @return this + */ + public function debug($variable = NULL, $next = NULL) { + //we are using tool in all cases + $class = get_class($this); + + //if variable is null + if(is_null($variable)) { + //output the class + Eden_Debug::i() + ->output(sprintf(self::DEBUG, $class)) + ->output($this); + + return $this; + } + + //if variable is true + if($variable === true) { + //return whatever the next response is + //or return the next specified variable + return Eden_Debug::i()->next($this, $next); + } + + //if variable is not a string + if(!is_string($variable)) { + //soft output error + Eden_Debug::i()->output(Eden_Error::DEBUG_NOT_STRING); + return $this; + } + + //if variable is set + if(isset($this->$variable)) { + //output it + Eden_Debug::i() + ->output(sprintf(self::DEBUG, $class.'->'.$variable)) + ->output($this->$variable); + + return $this; + } + + //could be private + $private = '_'.$variable; + //if private variable is set + if(isset($this->$private)) { + //output it + Eden_Debug::i() + ->output(sprintf(self::DEBUG, $class.'->'.$private)) + ->output($this->$private); + + return $this; + } + + //soft output error + Eden_Debug::i()->output(sprintf(Eden_Error::DEBUG_NOT_PROPERTY, $variable, $class)); + + return $this; + } + + /** + * Loops through returned result sets + * + * @param *callable + * @return this + */ + public function each($callback) { + Eden_Error::i()->argument(1, 'callable'); + return Eden_Loop::i()->iterate($this, $callback); + } + + /** + * Creates a class route for this class. + * + * @param *string the class route name + * @return Eden_Class + */ + public function routeThis($route) { + //argument 1 must be a string + Eden_Error::i()->argument(1, 'string'); + + if(func_num_args() == 1) { + //when someone calls a class call this instead + Eden_Route::i()->getClass()->route($route, $this); + return $this; + } + + //argument 2 must be a string + Eden_Error::i()->argument(2, 'string', 'object'); + + $args = func_get_args(); + + $source = array_shift($args); + $class = array_shift($args); + $destination = NULL; + + if(count($args)) { + $destination = array_shift($args); + } + + //when someone calls a method here call something ele instead + Eden_Route::i()->getMethod()->route($this, $source, $class, $destination); + return $this; + } + + /** + * Invokes When if conditional is false + * + * @param bool + * @return this|Eden_Noop + */ + public function when($isTrue, $lines = 0) { + if($isTrue) { + return $this; + } + + return Eden_When::i($this, $lines); + } + + /* Protected Methods + -------------------------------*/ + protected static function _getMultiple($class = NULL) { + if(is_null($class) && function_exists('get_called_class')) { + $class = get_called_class(); + } + + $class = Eden_Route::i()->getClass()->getRoute($class); + return self::_getInstance($class); + } + + protected static function _getSingleton($class = NULL) { + if(is_null($class) && function_exists('get_called_class')) { + $class = get_called_class(); + } + + $class = Eden_Route::i()->getClass()->getRoute($class); + + if(!isset(self::$_instances[$class])) { + self::$_instances[$class] = self::_getInstance($class); + } + + return self::$_instances[$class]; + } + + /* Private Methods + -------------------------------*/ + private static function _getInstance($class) { + $trace = debug_backtrace(); + $args = array(); + + if(isset($trace[1]['args']) && count($trace[1]['args']) > 1) { + $args = $trace[1]['args']; + //shift out the class name + array_shift($args); + } else if(isset($trace[2]['args']) && count($trace[2]['args']) > 0) { + $args = $trace[2]['args']; + } + + if(count($args) === 0 || !method_exists($class, '__construct')) { + return new $class; + } + + $reflect = new ReflectionClass($class); + + try { + return $reflect->newInstanceArgs($args); + } catch(Reflection_Exception $e) { + Eden_Error::i() + ->setMessage(Eden_Error::REFLECTION_ERROR) + ->addVariable($class) + ->addVariable('new') + ->trigger(); + } + } } \ No newline at end of file diff --git a/library/eden/collection.php b/library/eden/collection.php index e1038b7..430c9bc 100644 --- a/library/eden/collection.php +++ b/library/eden/collection.php @@ -1,410 +1,410 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * A collection is a list of common models used for mass manipulations. - * - * @package Eden - * @category model - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Collection extends Eden_Class implements ArrayAccess, Iterator, Serializable, Countable { - /* Constants - -------------------------------*/ - const FIRST = 'first'; - const LAST = 'last'; - const MODEL = 'Eden_Model'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_list = array(); - protected $_model = self::MODEL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __call($name, $args) { - //if the method starts with get - if(strpos($name, 'get') === 0) { - //getUserName('-') - get all rows column values - $value = isset($args[0]) ? $args[0] : NULL; - - //make a new model - $list = Eden_Model::i(); - //for each row - foreach($this->_list as $i => $row) { - //just add the column they want - //let the model worry about the rest - $list[] = $row->$name(isset($args[0]) ? $args[0] : NULL); - } - - return $list; - - //if the method starts with set - } else if (strpos($name, 'set') === 0) { - //setUserName('Chris', '-') - set all user names to Chris - $value = isset($args[0]) ? $args[0] : NULL; - $separator = isset($args[1]) ? $args[1] : NULL; - - //for each row - foreach($this->_list as $i => $row) { - //just call the method - //let the model worry about the rest - $row->$name($value, $separator); - } - - return $this; - } - - $found = false; - - //for an array of models the method might exist - //we should loop and check for a valid method - - foreach($this->_list as $i => $row) { - //if no method exists - if(!method_exists($row, $name)) { - continue; - } - - $found = true; - - //just call the method - //let the model worry about the rest - $row->callThis($name, $args); - } - - //if found, it means something happened - if($found) { - //so it was successful - return $this; - } - - //nothing more, just see what the parent has to say - try { - return parent::__call($name, $args); - } catch(Eden_Error $e) { - Eden_Collection_Error::i($e->getMessage())->trigger(); - } - } - - public function __construct(array $data = array()) { - $this->set($data); - } - - public function __set($name, $value) { - //set all rows with this column and value - foreach($this->_list as $i => $row) { - $row[$name] = $value; - } - - return $this; - } - - public function __toString() { - return json_encode($this->get()); - } - - /* Public Methods - -------------------------------*/ - /** - * Adds a row to the collection - * - * @param array|Eden_Model - * @return this - */ - public function add($row = array()) { - //Argument 1 must be an array or Eden_Model - Eden_Collection_Error::i()->argument(1, 'array', $this->_model); - - //if it's an array - if(is_array($row)) { - //make it a model - $model = $this->_model; - $row = $this->$model($row); - } - - //add it now - $this->_list[] = $row; - - return $this; - } - - /** - * returns size using the Countable interface - * - * @return string - */ - public function count() { - return count($this->_list); - } - - public function cut($index = self::LAST) { - //Argument 1 must be a string or integer - Eden_Collection_Error::i()->argument(1, 'string', 'int'); - - //if index is first - if($index == self::FIRST) { - //we really mean 0 - $index = 0; - //if index is last - } else if($index == self::LAST) { - //we realy mean the last index number - $index = count($this->_list) -1; - } - - //if this row is found - if(isset($this->_list[$index])) { - //unset it - unset($this->_list[$index]); - } - - //reindex the list - $this->_list = array_values($this->_list); - - return $this; - } - - /** - * Loops through returned result sets - * - * @param *callable - * @return this - */ - public function each($callback) { - Eden_Error::i()->argument(1, 'callable'); - - foreach($this->_list as $key => $value) { - call_user_func($callback, $key, $value); - } - - return $this; - } - - /** - * Returns the current item - * For Iterator interface - * - * @return void - */ - public function current() { - return current($this->_list); - } - - /** - * Returns the row array - * - * @param bool - * @return array - */ - public function get($modified = true) { - //Argument 1 must be a boolean - Eden_Collection_Error::i()->argument(1, 'bool'); - - $array = array(); - //for each row - foreach($this->_list as $i => $row) { - //get the array of that (recursive) - $array[$i] = $row->get($modified); - } - - return $array; - } - - /** - * Returns th current position - * For Iterator interface - * - * @return void - */ - public function key() { - return key($this->_list); - } - - /** - * Increases the position - * For Iterator interface - * - * @return void - */ - public function next() { - next($this->_list); - } - - /** - * isset using the ArrayAccess interface - * - * @param number - * @return bool - */ - public function offsetExists($offset) { - return isset($this->_list[$offset]); - } - - /** - * returns data using the ArrayAccess interface - * - * @param number - * @return bool - */ - public function offsetGet($offset) { - return isset($this->_list[$offset]) ? $this->_list[$offset] : NULL; - } - - /** - * Sets data using the ArrayAccess interface - * - * @param number - * @param mixed - * @return void - */ - public function offsetSet($offset, $value) { - //Argument 2 must be an array or Eden_Model - Eden_Collection_Error::i()->argument(2, 'array', $this->_model); - - if(is_array($value)) { - //make it a model - $model = $this->_model; - $value = $this->$model($value); - } - - if (is_null($offset)) { - $this->_list[] = $value; - } else { - $this->_list[$offset] = $value; - } - } - - /** - * unsets using the ArrayAccess interface - * - * @param number - * @return bool - */ - public function offsetUnset($offset) { - $this->_list = Eden_Model::i($this->_list) - ->cut($offset) - ->get(); - } - - /** - * Rewinds the position - * For Iterator interface - * - * @return void - */ - public function rewind() { - reset($this->_list); - } - - /** - * returns serialized data using the Serializable interface - * - * @return string - */ - public function serialize() { - return $this->__toString(); - } - - /** - * Sets data - * - * @return this - */ - public function set(array $data = array()) { - foreach($data as $row) { - $this->add($row); - } - - return $this; - } - - /** - * Sets default model - * - * @param string - * @return this - */ - public function setModel($model) { - $error = Eden_Collection_Error::i()->argument(1, 'string'); - - if(!is_subclass_of($model, 'Eden_Model')) { - $error->setMessage(Eden_Collection_Error::NOT_SUB_MODEL) - ->addVariable($model) - ->trigger(); - } - - $this->_model = $model; - - return $this; - } - - /** - * sets data using the Serializable interface - * - * @param string - * @return void - */ - public function unserialize($data) { - $this->_list = json_decode($data, true); - return $this; - } - - /** - * Validates whether if the index is set - * For Iterator interface - * - * @return void - */ - public function valid() { - return isset($this->_list[key($this->_list)]); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ -} - -/** - * Model Errors - */ -class Eden_Collection_Error extends Eden_Error { - /* Constants - -------------------------------*/ - const NOT_COLLECTION = 'The data passed into __construct is not a collection.'; - const NOT_SUB_MODEL = 'Class %s is not a child of Eden_Model'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * A collection is a list of common models used for mass manipulations. + * + * @package Eden + * @category model + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Collection extends Eden_Class implements ArrayAccess, Iterator, Serializable, Countable { + /* Constants + -------------------------------*/ + const FIRST = 'first'; + const LAST = 'last'; + const MODEL = 'Eden_Model'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_list = array(); + protected $_model = self::MODEL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __call($name, $args) { + //if the method starts with get + if(strpos($name, 'get') === 0) { + //getUserName('-') - get all rows column values + $value = isset($args[0]) ? $args[0] : NULL; + + //make a new model + $list = Eden_Model::i(); + //for each row + foreach($this->_list as $i => $row) { + //just add the column they want + //let the model worry about the rest + $list[] = $row->$name(isset($args[0]) ? $args[0] : NULL); + } + + return $list; + + //if the method starts with set + } else if (strpos($name, 'set') === 0) { + //setUserName('Chris', '-') - set all user names to Chris + $value = isset($args[0]) ? $args[0] : NULL; + $separator = isset($args[1]) ? $args[1] : NULL; + + //for each row + foreach($this->_list as $i => $row) { + //just call the method + //let the model worry about the rest + $row->$name($value, $separator); + } + + return $this; + } + + $found = false; + + //for an array of models the method might exist + //we should loop and check for a valid method + + foreach($this->_list as $i => $row) { + //if no method exists + if(!method_exists($row, $name)) { + continue; + } + + $found = true; + + //just call the method + //let the model worry about the rest + $row->callThis($name, $args); + } + + //if found, it means something happened + if($found) { + //so it was successful + return $this; + } + + //nothing more, just see what the parent has to say + try { + return parent::__call($name, $args); + } catch(Eden_Error $e) { + Eden_Collection_Error::i($e->getMessage())->trigger(); + } + } + + public function __construct(array $data = array()) { + $this->set($data); + } + + public function __set($name, $value) { + //set all rows with this column and value + foreach($this->_list as $i => $row) { + $row[$name] = $value; + } + + return $this; + } + + public function __toString() { + return json_encode($this->get()); + } + + /* Public Methods + -------------------------------*/ + /** + * Adds a row to the collection + * + * @param array|Eden_Model + * @return this + */ + public function add($row = array()) { + //Argument 1 must be an array or Eden_Model + Eden_Collection_Error::i()->argument(1, 'array', $this->_model); + + //if it's an array + if(is_array($row)) { + //make it a model + $model = $this->_model; + $row = $this->$model($row); + } + + //add it now + $this->_list[] = $row; + + return $this; + } + + /** + * returns size using the Countable interface + * + * @return string + */ + public function count() { + return count($this->_list); + } + + public function cut($index = self::LAST) { + //Argument 1 must be a string or integer + Eden_Collection_Error::i()->argument(1, 'string', 'int'); + + //if index is first + if($index == self::FIRST) { + //we really mean 0 + $index = 0; + //if index is last + } else if($index == self::LAST) { + //we realy mean the last index number + $index = count($this->_list) -1; + } + + //if this row is found + if(isset($this->_list[$index])) { + //unset it + unset($this->_list[$index]); + } + + //reindex the list + $this->_list = array_values($this->_list); + + return $this; + } + + /** + * Loops through returned result sets + * + * @param *callable + * @return this + */ + public function each($callback) { + Eden_Error::i()->argument(1, 'callable'); + + foreach($this->_list as $key => $value) { + call_user_func($callback, $key, $value); + } + + return $this; + } + + /** + * Returns the current item + * For Iterator interface + * + * @return void + */ + public function current() { + return current($this->_list); + } + + /** + * Returns the row array + * + * @param bool + * @return array + */ + public function get($modified = true) { + //Argument 1 must be a boolean + Eden_Collection_Error::i()->argument(1, 'bool'); + + $array = array(); + //for each row + foreach($this->_list as $i => $row) { + //get the array of that (recursive) + $array[$i] = $row->get($modified); + } + + return $array; + } + + /** + * Returns th current position + * For Iterator interface + * + * @return void + */ + public function key() { + return key($this->_list); + } + + /** + * Increases the position + * For Iterator interface + * + * @return void + */ + public function next() { + next($this->_list); + } + + /** + * isset using the ArrayAccess interface + * + * @param number + * @return bool + */ + public function offsetExists($offset) { + return isset($this->_list[$offset]); + } + + /** + * returns data using the ArrayAccess interface + * + * @param number + * @return bool + */ + public function offsetGet($offset) { + return isset($this->_list[$offset]) ? $this->_list[$offset] : NULL; + } + + /** + * Sets data using the ArrayAccess interface + * + * @param number + * @param mixed + * @return void + */ + public function offsetSet($offset, $value) { + //Argument 2 must be an array or Eden_Model + Eden_Collection_Error::i()->argument(2, 'array', $this->_model); + + if(is_array($value)) { + //make it a model + $model = $this->_model; + $value = $this->$model($value); + } + + if (is_null($offset)) { + $this->_list[] = $value; + } else { + $this->_list[$offset] = $value; + } + } + + /** + * unsets using the ArrayAccess interface + * + * @param number + * @return bool + */ + public function offsetUnset($offset) { + $this->_list = Eden_Model::i($this->_list) + ->cut($offset) + ->get(); + } + + /** + * Rewinds the position + * For Iterator interface + * + * @return void + */ + public function rewind() { + reset($this->_list); + } + + /** + * returns serialized data using the Serializable interface + * + * @return string + */ + public function serialize() { + return $this->__toString(); + } + + /** + * Sets data + * + * @return this + */ + public function set(array $data = array()) { + foreach($data as $row) { + $this->add($row); + } + + return $this; + } + + /** + * Sets default model + * + * @param string + * @return this + */ + public function setModel($model) { + $error = Eden_Collection_Error::i()->argument(1, 'string'); + + if(!is_subclass_of($model, 'Eden_Model')) { + $error->setMessage(Eden_Collection_Error::NOT_SUB_MODEL) + ->addVariable($model) + ->trigger(); + } + + $this->_model = $model; + + return $this; + } + + /** + * sets data using the Serializable interface + * + * @param string + * @return void + */ + public function unserialize($data) { + $this->_list = json_decode($data, true); + return $this; + } + + /** + * Validates whether if the index is set + * For Iterator interface + * + * @return void + */ + public function valid() { + return isset($this->_list[key($this->_list)]); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ +} + +/** + * Model Errors + */ +class Eden_Collection_Error extends Eden_Error { + /* Constants + -------------------------------*/ + const NOT_COLLECTION = 'The data passed into __construct is not a collection.'; + const NOT_SUB_MODEL = 'Class %s is not a child of Eden_Model'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/country/au.php b/library/eden/country/au.php index 3a5f55c..7f82a79 100644 --- a/library/eden/country/au.php +++ b/library/eden/country/au.php @@ -1,53 +1,53 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Australia - * - * @package Eden - * @category utility - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Country_Australia extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected static $_territories = array( - 'Australian Capital Territory', 'New South Wales', - 'Northern Territory', 'Queensland', - 'South Australia', 'Tasmania', - 'Victoria', 'Western Australia'); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns a list of Austrailian territories - * - * @return array - */ - public function getTerritories() { - return self::$_territories; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Australia + * + * @package Eden + * @category utility + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Country_Australia extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected static $_territories = array( + 'Australian Capital Territory', 'New South Wales', + 'Northern Territory', 'Queensland', + 'South Australia', 'Tasmania', + 'Victoria', 'Western Australia'); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns a list of Austrailian territories + * + * @return array + */ + public function getTerritories() { + return self::$_territories; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/country/ca.php b/library/eden/country/ca.php index ea3266f..ea92fd2 100644 --- a/library/eden/country/ca.php +++ b/library/eden/country/ca.php @@ -1,56 +1,56 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Canada - * - * @package Eden - * @category utility - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Country_Ca extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected static $_territories = array( - 'BC' => 'British Columbia', 'ON' => 'Ontario', - 'NL' => 'Newfoundland and Labrador', 'NS' => 'Nova Scotia', - 'PE' => 'Prince Edward Island', 'NB' => 'New Brunswick', - 'QC' => 'Quebec', 'MB' => 'Manitoba', - 'SK' => 'Saskatchewan', 'AB' => 'Alberta', - 'NT' => 'Northwest Territories', 'NU' => 'Nunavut', - 'YT' => 'Yukon Territory'); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns a list of Canadian territories - * - * @return array - */ - public function getTerritories() { - return self::$_territories; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Canada + * + * @package Eden + * @category utility + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Country_Ca extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected static $_territories = array( + 'BC' => 'British Columbia', 'ON' => 'Ontario', + 'NL' => 'Newfoundland and Labrador', 'NS' => 'Nova Scotia', + 'PE' => 'Prince Edward Island', 'NB' => 'New Brunswick', + 'QC' => 'Quebec', 'MB' => 'Manitoba', + 'SK' => 'Saskatchewan', 'AB' => 'Alberta', + 'NT' => 'Northwest Territories', 'NU' => 'Nunavut', + 'YT' => 'Yukon Territory'); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns a list of Canadian territories + * + * @return array + */ + public function getTerritories() { + return self::$_territories; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/country/error.php b/library/eden/country/error.php index 461e695..c19dfd1 100644 --- a/library/eden/country/error.php +++ b/library/eden/country/error.php @@ -1,39 +1,39 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Country exception - * - * @package Eden - * @category utility - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Country_Error extends Eden_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Country exception + * + * @package Eden + * @category utility + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Country_Error extends Eden_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/country/uk.php b/library/eden/country/uk.php index 471b418..b5eca75 100644 --- a/library/eden/country/uk.php +++ b/library/eden/country/uk.php @@ -1,103 +1,103 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * United Kingdom - * - * @package Eden - * @category utility - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Country_Uk extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns a list of counties - * - * @return array - */ - public function getCounties() { - return self::$_counties; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ - /* Large Data - -------------------------------*/ - protected static $_counties = array( - 'Aberdeenshire', 'Alderney', - 'Angus/Forfarshire', 'Argyllshire', - 'Avon', 'Ayrshire', - 'Banffshire', 'Bedfordshire', - 'Berkshire', 'Berwickshire', - 'Buckinghamshire', 'Buteshire', - 'Caithness', 'Cambridgeshire', - 'Cheshire', 'Clackmannanshire', - 'Clwyd', 'Cornwall', - 'County Antrim', 'County Armagh', - 'County Down', 'County Fermanagh', - 'County Londonderry', 'County Tyrone', - 'Cumbria', 'Derbyshire', - 'Devon', 'Dorset', - 'Dumbartonshire', 'Dumfriesshire', - 'Durham', 'Dyfed', - 'East Lothian', 'East Sussex', - 'East Yorkshire', 'Essex', - 'Fair Isle', 'Fife', - 'Gloucestershire', 'Greater London', - 'Greater Manchester', 'Guernsey', - 'Gwent', 'Gwynedd', - 'Hampshire', 'Herefordshire', - 'Herm', 'Hertfordshire', - 'Huntingdonshire', 'Inner Hebrides', - 'Inverness-shire', 'Isle of Man', - 'Isle of Wight', 'Isles of Scilly', - 'Jersey', 'Kent', - 'Kincardineshire', 'Kinross-shire', - 'Kirkcudbrightshire', 'Lanarkshire', - 'Lancashire', 'Leicestershire', - 'Lincolnshire', 'Merseyside', - 'Mid Glamorgan', 'Middlesex', - 'Midlothian/Edinburghshire', 'Morayshire', - 'Nairnshire', 'Norfolk', - 'North Yorkshire', 'Northamptonshire', - 'Northumberland', 'Nottinghamshire', - 'Orkney', 'Outer Hebrides', - 'Oxfordshire', 'Peeblesshire', - 'Perthshire', 'Powys', - 'Renfrewshire', 'Ross-shire', - 'Roxburghshire', 'Rutland', - 'Sark', 'Selkirkshire', - 'Shetland', 'Shropshire', - 'Somerset', 'South Glamorgan', - 'South Yorkshire', 'Staffordshire', - 'Stirlingshire', 'Suffolk', - 'Surrey', 'Sutherland', - 'Tyne and Wear', 'Warwickshire', - 'West Glamorgan', 'West Lothian/Linlithgowshire', - 'West Midlands', 'West Sussex', - 'West Yorkshire', 'Wigtownshire', - 'Wiltshire', 'Worcestershire'); + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * United Kingdom + * + * @package Eden + * @category utility + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Country_Uk extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns a list of counties + * + * @return array + */ + public function getCounties() { + return self::$_counties; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ + /* Large Data + -------------------------------*/ + protected static $_counties = array( + 'Aberdeenshire', 'Alderney', + 'Angus/Forfarshire', 'Argyllshire', + 'Avon', 'Ayrshire', + 'Banffshire', 'Bedfordshire', + 'Berkshire', 'Berwickshire', + 'Buckinghamshire', 'Buteshire', + 'Caithness', 'Cambridgeshire', + 'Cheshire', 'Clackmannanshire', + 'Clwyd', 'Cornwall', + 'County Antrim', 'County Armagh', + 'County Down', 'County Fermanagh', + 'County Londonderry', 'County Tyrone', + 'Cumbria', 'Derbyshire', + 'Devon', 'Dorset', + 'Dumbartonshire', 'Dumfriesshire', + 'Durham', 'Dyfed', + 'East Lothian', 'East Sussex', + 'East Yorkshire', 'Essex', + 'Fair Isle', 'Fife', + 'Gloucestershire', 'Greater London', + 'Greater Manchester', 'Guernsey', + 'Gwent', 'Gwynedd', + 'Hampshire', 'Herefordshire', + 'Herm', 'Hertfordshire', + 'Huntingdonshire', 'Inner Hebrides', + 'Inverness-shire', 'Isle of Man', + 'Isle of Wight', 'Isles of Scilly', + 'Jersey', 'Kent', + 'Kincardineshire', 'Kinross-shire', + 'Kirkcudbrightshire', 'Lanarkshire', + 'Lancashire', 'Leicestershire', + 'Lincolnshire', 'Merseyside', + 'Mid Glamorgan', 'Middlesex', + 'Midlothian/Edinburghshire', 'Morayshire', + 'Nairnshire', 'Norfolk', + 'North Yorkshire', 'Northamptonshire', + 'Northumberland', 'Nottinghamshire', + 'Orkney', 'Outer Hebrides', + 'Oxfordshire', 'Peeblesshire', + 'Perthshire', 'Powys', + 'Renfrewshire', 'Ross-shire', + 'Roxburghshire', 'Rutland', + 'Sark', 'Selkirkshire', + 'Shetland', 'Shropshire', + 'Somerset', 'South Glamorgan', + 'South Yorkshire', 'Staffordshire', + 'Stirlingshire', 'Suffolk', + 'Surrey', 'Sutherland', + 'Tyne and Wear', 'Warwickshire', + 'West Glamorgan', 'West Lothian/Linlithgowshire', + 'West Midlands', 'West Sussex', + 'West Yorkshire', 'Wigtownshire', + 'Wiltshire', 'Worcestershire'); } \ No newline at end of file diff --git a/library/eden/curl.php b/library/eden/curl.php index 6bc4817..1a210c1 100644 --- a/library/eden/curl.php +++ b/library/eden/curl.php @@ -1,588 +1,588 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/class.php'; - -/** - * cURL allows you to connect and communicate to many - * different types of servers with many different types - * of protocols. We rely on cURL heavily as the main - * transport for all API interactions. - * - * @package Eden - * @category curl - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Curl extends Eden_Class implements ArrayAccess { - /* Constants - -------------------------------*/ - const PUT = 'PUT'; - const DELETE = 'DELETE'; - const GET = 'GET'; - const POST = 'POST'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_options = array(); - protected $_meta = array(); - protected $_query = array(); - protected $_headers = array(); - - protected static $_setBoolKeys = array( - 'AutoReferer' => CURLOPT_AUTOREFERER, - 'BinaryTransfer' => CURLOPT_BINARYTRANSFER, - 'CookieSession' => CURLOPT_COOKIESESSION, - 'CrlF' => CURLOPT_CRLF, - 'DnsUseGlobalCache' => CURLOPT_DNS_USE_GLOBAL_CACHE, - 'FailOnError' => CURLOPT_FAILONERROR, - 'FileTime' => CURLOPT_FILETIME, - 'FollowLocation' => CURLOPT_FOLLOWLOCATION, - 'ForbidReuse' => CURLOPT_FORBID_REUSE, - 'FreshConnect' => CURLOPT_FRESH_CONNECT, - 'FtpUseEprt' => CURLOPT_FTP_USE_EPRT, - 'FtpUseEpsv' => CURLOPT_FTP_USE_EPSV, - 'FtpAppend' => CURLOPT_FTPAPPEND, - 'FtpListOnly' => CURLOPT_FTPLISTONLY, - 'Header' => CURLOPT_HEADER, - 'HeaderOut' => CURLINFO_HEADER_OUT, - 'HttpGet' => CURLOPT_HTTPGET, - 'HttpProxyTunnel' => CURLOPT_HTTPPROXYTUNNEL, - 'Netrc' => CURLOPT_NETRC, - 'Nobody' => CURLOPT_NOBODY, - 'NoProgress' => CURLOPT_NOPROGRESS, - 'NoSignal' => CURLOPT_NOSIGNAL, - 'Post' => CURLOPT_POST, - 'Put' => CURLOPT_PUT, - 'ReturnTransfer' => CURLOPT_RETURNTRANSFER, - 'SslVerifyPeer' => CURLOPT_SSL_VERIFYPEER, - 'TransferText' => CURLOPT_TRANSFERTEXT, - 'UnrestrictedAuth' => CURLOPT_UNRESTRICTED_AUTH, - 'Upload' => CURLOPT_UPLOAD, - 'Verbose' => CURLOPT_VERBOSE); - - protected static $_setIntegerKeys = array( - 'BufferSize' => CURLOPT_BUFFERSIZE, - 'ClosePolicy' => CURLOPT_CLOSEPOLICY, - 'ConnectTimeout' => CURLOPT_CONNECTTIMEOUT, - 'ConnectTimeoutMs' => CURLOPT_CONNECTTIMEOUT_MS, - 'DnsCacheTimeout' => CURLOPT_DNS_CACHE_TIMEOUT, - 'FtpSslAuth' => CURLOPT_FTPSSLAUTH, - 'HttpVersion' => CURLOPT_HTTP_VERSION, - 'HttpAuth' => CURLOPT_HTTPAUTH, - 'InFileSize' => CURLOPT_INFILESIZE, - 'LowSpeedLimit' => CURLOPT_LOW_SPEED_LIMIT, - 'LowSpeedTime' => CURLOPT_LOW_SPEED_TIME, - 'MaxConnects' => CURLOPT_MAXCONNECTS, - 'MaxRedirs' => CURLOPT_MAXREDIRS, - 'Port' => CURLOPT_PORT, - 'ProxyAuth' => CURLOPT_PROXYAUTH, - 'ProxyPort' => CURLOPT_PROXYPORT, - 'ProxyType' => CURLOPT_PROXYTYPE, - 'ResumeFrom' => CURLOPT_RESUME_FROM, - 'SslVerifyHost' => CURLOPT_SSL_VERIFYHOST, - 'SslVersion' => CURLOPT_SSLVERSION, - 'TimeCondition' => CURLOPT_TIMECONDITION, - 'Timeout' => CURLOPT_TIMEOUT, - 'TimeoutMs' => CURLOPT_TIMEOUT_MS, - 'TimeValue' => CURLOPT_TIMEVALUE); - - protected static $_setStringKeys = array( - 'CaInfo' => CURLOPT_CAINFO, - 'CaPath' => CURLOPT_CAPATH, - 'Cookie' => CURLOPT_COOKIE, - 'CookieFile' => CURLOPT_COOKIEFILE, - 'CookieJar' => CURLOPT_COOKIEJAR, - 'CustomRequest' => CURLOPT_CUSTOMREQUEST, - 'EgdSocket' => CURLOPT_EGDSOCKET, - 'Encoding' => CURLOPT_ENCODING, - 'FtpPort' => CURLOPT_FTPPORT, - 'Interface' => CURLOPT_INTERFACE, - 'Krb4Level' => CURLOPT_KRB4LEVEL, - 'PostFields' => CURLOPT_POSTFIELDS, - 'Proxy' => CURLOPT_PROXY, - 'ProxyUserPwd' => CURLOPT_PROXYUSERPWD, - 'RandomFile' => CURLOPT_RANDOM_FILE, - 'Range' => CURLOPT_RANGE, - 'Referer' => CURLOPT_REFERER, - 'SslCipherList' => CURLOPT_SSL_CIPHER_LIST, - 'SslCert' => CURLOPT_SSLCERT, - 'SslCertPassword' => CURLOPT_SSLCERTPASSWD, - 'SslCertType' => CURLOPT_SSLCERTTYPE, - 'SslEngine' => CURLOPT_SSLENGINE, - 'SslEngineDefault' => CURLOPT_SSLENGINE_DEFAULT, - 'Sslkey' => CURLOPT_SSLKEY, - 'SslKeyPasswd' => CURLOPT_SSLKEYPASSWD, - 'SslKeyType' => CURLOPT_SSLKEYTYPE, - 'Url' => CURLOPT_URL, - 'UserAgent' => CURLOPT_USERAGENT, - 'UserPwd' => CURLOPT_USERPWD); - - protected static $_setArrayKeys = array( - 'Http200Aliases' => CURLOPT_HTTP200ALIASES, - 'HttpHeader' => CURLOPT_HTTPHEADER, - 'PostQuote' => CURLOPT_POSTQUOTE, - 'Quote' => CURLOPT_QUOTE); - - protected static $_setFileKeys = array( - 'File' => CURLOPT_FILE, - 'InFile' => CURLOPT_INFILE, - 'StdErr' => CURLOPT_STDERR, - 'WriteHeader' => CURLOPT_WRITEHEADER); - - protected static $_setCallbackKeys = array( - 'HeaderFunction' => CURLOPT_HEADERFUNCTION, - 'ReadFunction' => CURLOPT_READFUNCTION, - 'WriteFunction' => CURLOPT_WRITEFUNCTION); - - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __call($name, $args) { - if(strpos($name, 'set') === 0) { - $method = substr($name, 3); - - if(isset(self::$_setBoolKeys[$method])) { - Eden_Curl_Error::i()->vargument($name, $args, 1, 'bool'); - $key = self::$_setBoolKeys[$method]; - $this->_options[$key] = $args[0]; - - return $this; - } - - if(isset(self::$_setIntegerKeys[$method])) { - Eden_Curl_Error::i()->vargument($name, $args, 1, 'int'); - $key = self::$_setIntegerKeys[$method]; - $this->_options[$key] = $args[0]; - - return $this; - } - - if(isset(self::$_setStringKeys[$method])) { - Eden_Curl_Error::i()->vargument($name, $args, 1, 'string'); - $key = self::$_setStringKeys[$method]; - $this->_options[$key] = $args[0]; - - return $this; - } - - if(isset(self::$_setArrayKeys[$method])) { - Eden_Curl_Error::i()->vargument($name, $args, 1, 'array'); - $key = self::$_setArrayKeys[$method]; - $this->_options[$key] = $args[0]; - - return $this; - } - - if(isset(self::$_setFileKeys[$method])) { - $key = self::$_setFileKeys[$method]; - $this->_options[$key] = $args[0]; - - return $this; - } - - if(isset(self::$_setCallbackKeys[$method])) { - Eden_Curl_Error::i()->vargument($name, $args, 1, 'array', 'string'); - $key = self::$_setCallbackKeys[$method]; - $this->_options[$key] = $args[0]; - - return $this; - } - } - - parent::__call($name, $args); - } - - /* Public Methods - -------------------------------*/ - /** - * Send the curl off and returns the results - * parsed as DOMDocument - * - * @return DOMDOcument - */ - public function getDomDocumentResponse() { - $this->_meta['response'] = $this->getResponse(); - $xml = new DOMDocument(); - $xml->loadXML($this->_meta['response']); - return $xml; - } - - /** - * Send the curl off and returns the results - * parsed as JSON - * - * @return array - */ - public function getJsonResponse($assoc = true) { - $this->_meta['response'] = $this->getResponse(); - Eden_Curl_Error::i()->argument(1, 'bool'); - return json_decode($this->_meta['response'], $assoc); - } - - /** - * Returns the meta of the last call - * - * @return array - */ - public function getMeta($key = NULL) { - Eden_Curl_Error::i()->argument(1, 'string', 'null'); - - if(isset($this->_meta[$key])) { - return $this->_meta[$key]; - } - - return $this->_meta; - } - - /** - * Send the curl off and returns the results - * parsed as url query - * - * @return array - */ - public function getQueryResponse() { - $this->_meta['response'] = $this->getResponse(); - parse_str($this->_meta['response'], $response); - return $response; - } - - /** - * Send the curl off and returns the results - * - * @return string - */ - public function getResponse() { - $curl = curl_init(); - - $this->_addParameters()->_addHeaders(); - $this->_options[CURLOPT_RETURNTRANSFER] = true; - curl_setopt_array($curl, $this->_options); - - $response = curl_exec($curl); - - $this->_meta = array( - 'info' => curl_getinfo($curl, CURLINFO_HTTP_CODE), - 'error_message' => curl_errno($curl), - 'error_code' => curl_error($curl)); - - curl_close($curl); - unset($curl); - - return $response; - } - - /** - * Send the curl off and returns the results - * parsed as SimpleXml - * - * @return SimpleXmlElement - */ - public function getSimpleXmlResponse() { - $this->_meta['response'] = $this->getResponse(); - return simplexml_load_string($this->_meta['response']); - } - - /** - * isset using the ArrayAccess interface - * - * @param number - * @return bool - */ - public function offsetExists($offset) { - return isset($this->_option[$offset]); - } - - /** - * returns data using the ArrayAccess interface - * - * @param number - * @return bool - */ - public function offsetGet($offset) { - return isset($this->_option[$offset]) ? $this->_option[$offset] : NULL; - } - - /** - * Sets data using the ArrayAccess interface - * - * @param number - * @param mixed - * @return void - */ - public function offsetSet($offset, $value) { - if (!is_null($offset)) { - if(in_array($offset, $this->_setBoolKeys)) { - $method = array_search($offset, $this->_setBoolKeys); - $this->_call('set'.$method, array($value)); - } - - if(in_array($offset, $this->_setIntegerKeys)) { - $method = array_search($offset, $this->_setIntegerKeys); - $this->_call('set'.$method, array($value)); - } - - if(in_array($offset, $this->_setStringKeys)) { - $method = array_search($offset, $this->_setStringKeys); - $this->_call('set'.$method, array($value)); - } - - if(in_array($offset, $this->_setArrayKeys)) { - $method = array_search($offset, $this->_setArrayKeys); - $this->_call('set'.$method, array($value)); - } - - if(in_array($offset, $this->_setFileKeys)) { - $method = array_search($offset, $this->_setFileKeys); - $this->_call('set'.$method, array($value)); - } - - if(in_array($offset, $this->_setCallbackKeys)) { - $method = array_search($offset, $this->_setCallbackKeys); - $this->_call('set'.$method, array($value)); - } - } - } - - /** - * unsets using the ArrayAccess interface - * - * @param number - * @return bool - */ - public function offsetUnset($offset) { - unset($this->_option[$offset]); - } - - /** - * Send the curl off - * - * @return this - */ - public function send() { - $curl = curl_init(); - - $this->_addParameters()->_addHeaders(); - curl_setopt_array($curl, $this->_options); - curl_exec($curl); - - $this->_meta = array( - 'info' => curl_getinfo($curl, CURLINFO_HTTP_CODE), - 'error_message' => curl_errno($curl), - 'error_code' => curl_error($curl)); - - curl_close($curl); - unset($curl); - - return $this; - } - - /** - * Curl has problems handling custom request types - * from misconfigured end points or vice versa. - * When default cURL fails, try a custom GET instead - * - * @return this - */ - public function setCustomGet() { - $this->setCustomRequest(self::GET); - return $this; - } - - /** - * Curl has problems handling custom request types - * from misconfigured end points or vice versa. - * When default cURL fails, try a custom POST instead - * - * @return this - */ - public function setCustomPost() { - $this->setCustomRequest(self::POST); - return $this; - } - - /** - * Curl has problems handling custom request types - * from misconfigured end points or vice versa. - * When default cURL fails, try a custom PUT instead - * - * @return this - */ - public function setCustomPut() { - $this->setCustomRequest(self::PUT); - return $this; - } - - /** - * Curl has problems handling custom request types - * from misconfigured end points or vice versa. - * When default cURL fails, try a custom DELETE instead - * - * @return this - */ - public function setCustomDelete() { - $this->setCustomRequest(self::DELETE); - return $this; - } - - /** - * CURLOPT_POSTFIELDS accepts array and string - * arguments, this is a special case that __call - * does not handle - * - * @param string|array - * @return this - */ - public function setPostFields($fields) { - //argument 1 must be a string or array - Eden_Curl_Error::i()->argument(1, 'array', 'string'); - $this->_options[CURLOPT_POSTFIELDS] = $fields; - - return $this; - } - - /** - * Sets request headers - * - * @param array|string - * @return this - */ - public function setHeaders($key, $value = NULL) { - Eden_Curl_Error::i() - ->argument(1, 'array', 'string') - ->argument(2, 'scalar','null'); - - if(is_array($key)) { - $this->_headers = $key; - return $this; - } - - $this->_headers[] = $key.': '.$value; - return $this; - } - - /** - * Sets url parameter - * - * @param array|string - * @return this - */ - public function setUrlParameter($key, $value = NULL) { - Eden_Curl_Error::i() - ->argument(1, 'array', 'string') - ->argument(2, 'scalar'); - - if(is_array($key)) { - $this->_param = $key; - return $this; - } - - $this->_param[$key] = $value; - } - - /** - * Sets CURLOPT_SSL_VERIFYHOST - * - * @param bool - * @return this - */ - public function verifyHost($on = true) { - Eden_Curl_Error::i()->argument(1, 'bool'); - $this->_options[CURLOPT_SSL_VERIFYHOST] = $on ? 1 : 2; - return $this; - } - - /** - * Sets CURLOPT_SSL_VERIFYPEER - * - * @param bool - * @return this - */ - public function verifyPeer($on = true) { - Eden_Curl_Error::i()->argument(1, 'bool'); - $this->_options[CURLOPT_SSL_VERIFYPEER] = $on; - return $this; - } - - /* Protected Methods - -------------------------------*/ - protected function _addHeaders() { - if(empty($this->_headers)) { - return $this; - } - - $this->_options[CURLOPT_HTTPHEADER] = $this->_headers; - return $this; - } - - protected function _addParameters() { - if(empty($this->_params)) { - return $this; - } - - $params = http_build_query($this->_params); - if($this->_options[CURLOPT_POST]) { - $this->_options[CURLOPT_POSTFIELDS] = $params; - return $this; - } - - //if there is a question mark in the url - if(strpos($this->_options[CURLOPT_URL], '?') === false) { - //add the question mark - $params = '?'.$params; - //else if the question mark is not at the end - } else if(substr($this->_options[CURLOPT_URL], -1, 1) != '?') { - //append the parameters to the end - //with the other parameters - $params = '&'.$params; - } - - //append the parameters - $this->_options[CURLOPT_URL] .= $params; - - return $this; - } - - /* Private Methods - -------------------------------*/ -} - -/** - * cUrl Errors - */ -class Eden_Curl_Error extends Eden_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/class.php'; + +/** + * cURL allows you to connect and communicate to many + * different types of servers with many different types + * of protocols. We rely on cURL heavily as the main + * transport for all API interactions. + * + * @package Eden + * @category curl + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Curl extends Eden_Class implements ArrayAccess { + /* Constants + -------------------------------*/ + const PUT = 'PUT'; + const DELETE = 'DELETE'; + const GET = 'GET'; + const POST = 'POST'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_options = array(); + protected $_meta = array(); + protected $_query = array(); + protected $_headers = array(); + + protected static $_setBoolKeys = array( + 'AutoReferer' => CURLOPT_AUTOREFERER, + 'BinaryTransfer' => CURLOPT_BINARYTRANSFER, + 'CookieSession' => CURLOPT_COOKIESESSION, + 'CrlF' => CURLOPT_CRLF, + 'DnsUseGlobalCache' => CURLOPT_DNS_USE_GLOBAL_CACHE, + 'FailOnError' => CURLOPT_FAILONERROR, + 'FileTime' => CURLOPT_FILETIME, + 'FollowLocation' => CURLOPT_FOLLOWLOCATION, + 'ForbidReuse' => CURLOPT_FORBID_REUSE, + 'FreshConnect' => CURLOPT_FRESH_CONNECT, + 'FtpUseEprt' => CURLOPT_FTP_USE_EPRT, + 'FtpUseEpsv' => CURLOPT_FTP_USE_EPSV, + 'FtpAppend' => CURLOPT_FTPAPPEND, + 'FtpListOnly' => CURLOPT_FTPLISTONLY, + 'Header' => CURLOPT_HEADER, + 'HeaderOut' => CURLINFO_HEADER_OUT, + 'HttpGet' => CURLOPT_HTTPGET, + 'HttpProxyTunnel' => CURLOPT_HTTPPROXYTUNNEL, + 'Netrc' => CURLOPT_NETRC, + 'Nobody' => CURLOPT_NOBODY, + 'NoProgress' => CURLOPT_NOPROGRESS, + 'NoSignal' => CURLOPT_NOSIGNAL, + 'Post' => CURLOPT_POST, + 'Put' => CURLOPT_PUT, + 'ReturnTransfer' => CURLOPT_RETURNTRANSFER, + 'SslVerifyPeer' => CURLOPT_SSL_VERIFYPEER, + 'TransferText' => CURLOPT_TRANSFERTEXT, + 'UnrestrictedAuth' => CURLOPT_UNRESTRICTED_AUTH, + 'Upload' => CURLOPT_UPLOAD, + 'Verbose' => CURLOPT_VERBOSE); + + protected static $_setIntegerKeys = array( + 'BufferSize' => CURLOPT_BUFFERSIZE, + 'ClosePolicy' => CURLOPT_CLOSEPOLICY, + 'ConnectTimeout' => CURLOPT_CONNECTTIMEOUT, + 'ConnectTimeoutMs' => CURLOPT_CONNECTTIMEOUT_MS, + 'DnsCacheTimeout' => CURLOPT_DNS_CACHE_TIMEOUT, + 'FtpSslAuth' => CURLOPT_FTPSSLAUTH, + 'HttpVersion' => CURLOPT_HTTP_VERSION, + 'HttpAuth' => CURLOPT_HTTPAUTH, + 'InFileSize' => CURLOPT_INFILESIZE, + 'LowSpeedLimit' => CURLOPT_LOW_SPEED_LIMIT, + 'LowSpeedTime' => CURLOPT_LOW_SPEED_TIME, + 'MaxConnects' => CURLOPT_MAXCONNECTS, + 'MaxRedirs' => CURLOPT_MAXREDIRS, + 'Port' => CURLOPT_PORT, + 'ProxyAuth' => CURLOPT_PROXYAUTH, + 'ProxyPort' => CURLOPT_PROXYPORT, + 'ProxyType' => CURLOPT_PROXYTYPE, + 'ResumeFrom' => CURLOPT_RESUME_FROM, + 'SslVerifyHost' => CURLOPT_SSL_VERIFYHOST, + 'SslVersion' => CURLOPT_SSLVERSION, + 'TimeCondition' => CURLOPT_TIMECONDITION, + 'Timeout' => CURLOPT_TIMEOUT, + 'TimeoutMs' => CURLOPT_TIMEOUT_MS, + 'TimeValue' => CURLOPT_TIMEVALUE); + + protected static $_setStringKeys = array( + 'CaInfo' => CURLOPT_CAINFO, + 'CaPath' => CURLOPT_CAPATH, + 'Cookie' => CURLOPT_COOKIE, + 'CookieFile' => CURLOPT_COOKIEFILE, + 'CookieJar' => CURLOPT_COOKIEJAR, + 'CustomRequest' => CURLOPT_CUSTOMREQUEST, + 'EgdSocket' => CURLOPT_EGDSOCKET, + 'Encoding' => CURLOPT_ENCODING, + 'FtpPort' => CURLOPT_FTPPORT, + 'Interface' => CURLOPT_INTERFACE, + 'Krb4Level' => CURLOPT_KRB4LEVEL, + 'PostFields' => CURLOPT_POSTFIELDS, + 'Proxy' => CURLOPT_PROXY, + 'ProxyUserPwd' => CURLOPT_PROXYUSERPWD, + 'RandomFile' => CURLOPT_RANDOM_FILE, + 'Range' => CURLOPT_RANGE, + 'Referer' => CURLOPT_REFERER, + 'SslCipherList' => CURLOPT_SSL_CIPHER_LIST, + 'SslCert' => CURLOPT_SSLCERT, + 'SslCertPassword' => CURLOPT_SSLCERTPASSWD, + 'SslCertType' => CURLOPT_SSLCERTTYPE, + 'SslEngine' => CURLOPT_SSLENGINE, + 'SslEngineDefault' => CURLOPT_SSLENGINE_DEFAULT, + 'Sslkey' => CURLOPT_SSLKEY, + 'SslKeyPasswd' => CURLOPT_SSLKEYPASSWD, + 'SslKeyType' => CURLOPT_SSLKEYTYPE, + 'Url' => CURLOPT_URL, + 'UserAgent' => CURLOPT_USERAGENT, + 'UserPwd' => CURLOPT_USERPWD); + + protected static $_setArrayKeys = array( + 'Http200Aliases' => CURLOPT_HTTP200ALIASES, + 'HttpHeader' => CURLOPT_HTTPHEADER, + 'PostQuote' => CURLOPT_POSTQUOTE, + 'Quote' => CURLOPT_QUOTE); + + protected static $_setFileKeys = array( + 'File' => CURLOPT_FILE, + 'InFile' => CURLOPT_INFILE, + 'StdErr' => CURLOPT_STDERR, + 'WriteHeader' => CURLOPT_WRITEHEADER); + + protected static $_setCallbackKeys = array( + 'HeaderFunction' => CURLOPT_HEADERFUNCTION, + 'ReadFunction' => CURLOPT_READFUNCTION, + 'WriteFunction' => CURLOPT_WRITEFUNCTION); + + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __call($name, $args) { + if(strpos($name, 'set') === 0) { + $method = substr($name, 3); + + if(isset(self::$_setBoolKeys[$method])) { + Eden_Curl_Error::i()->vargument($name, $args, 1, 'bool'); + $key = self::$_setBoolKeys[$method]; + $this->_options[$key] = $args[0]; + + return $this; + } + + if(isset(self::$_setIntegerKeys[$method])) { + Eden_Curl_Error::i()->vargument($name, $args, 1, 'int'); + $key = self::$_setIntegerKeys[$method]; + $this->_options[$key] = $args[0]; + + return $this; + } + + if(isset(self::$_setStringKeys[$method])) { + Eden_Curl_Error::i()->vargument($name, $args, 1, 'string'); + $key = self::$_setStringKeys[$method]; + $this->_options[$key] = $args[0]; + + return $this; + } + + if(isset(self::$_setArrayKeys[$method])) { + Eden_Curl_Error::i()->vargument($name, $args, 1, 'array'); + $key = self::$_setArrayKeys[$method]; + $this->_options[$key] = $args[0]; + + return $this; + } + + if(isset(self::$_setFileKeys[$method])) { + $key = self::$_setFileKeys[$method]; + $this->_options[$key] = $args[0]; + + return $this; + } + + if(isset(self::$_setCallbackKeys[$method])) { + Eden_Curl_Error::i()->vargument($name, $args, 1, 'array', 'string'); + $key = self::$_setCallbackKeys[$method]; + $this->_options[$key] = $args[0]; + + return $this; + } + } + + parent::__call($name, $args); + } + + /* Public Methods + -------------------------------*/ + /** + * Send the curl off and returns the results + * parsed as DOMDocument + * + * @return DOMDOcument + */ + public function getDomDocumentResponse() { + $this->_meta['response'] = $this->getResponse(); + $xml = new DOMDocument(); + $xml->loadXML($this->_meta['response']); + return $xml; + } + + /** + * Send the curl off and returns the results + * parsed as JSON + * + * @return array + */ + public function getJsonResponse($assoc = true) { + $this->_meta['response'] = $this->getResponse(); + Eden_Curl_Error::i()->argument(1, 'bool'); + return json_decode($this->_meta['response'], $assoc); + } + + /** + * Returns the meta of the last call + * + * @return array + */ + public function getMeta($key = NULL) { + Eden_Curl_Error::i()->argument(1, 'string', 'null'); + + if(isset($this->_meta[$key])) { + return $this->_meta[$key]; + } + + return $this->_meta; + } + + /** + * Send the curl off and returns the results + * parsed as url query + * + * @return array + */ + public function getQueryResponse() { + $this->_meta['response'] = $this->getResponse(); + parse_str($this->_meta['response'], $response); + return $response; + } + + /** + * Send the curl off and returns the results + * + * @return string + */ + public function getResponse() { + $curl = curl_init(); + + $this->_addParameters()->_addHeaders(); + $this->_options[CURLOPT_RETURNTRANSFER] = true; + curl_setopt_array($curl, $this->_options); + + $response = curl_exec($curl); + + $this->_meta = array( + 'info' => curl_getinfo($curl, CURLINFO_HTTP_CODE), + 'error_message' => curl_errno($curl), + 'error_code' => curl_error($curl)); + + curl_close($curl); + unset($curl); + + return $response; + } + + /** + * Send the curl off and returns the results + * parsed as SimpleXml + * + * @return SimpleXmlElement + */ + public function getSimpleXmlResponse() { + $this->_meta['response'] = $this->getResponse(); + return simplexml_load_string($this->_meta['response']); + } + + /** + * isset using the ArrayAccess interface + * + * @param number + * @return bool + */ + public function offsetExists($offset) { + return isset($this->_option[$offset]); + } + + /** + * returns data using the ArrayAccess interface + * + * @param number + * @return bool + */ + public function offsetGet($offset) { + return isset($this->_option[$offset]) ? $this->_option[$offset] : NULL; + } + + /** + * Sets data using the ArrayAccess interface + * + * @param number + * @param mixed + * @return void + */ + public function offsetSet($offset, $value) { + if (!is_null($offset)) { + if(in_array($offset, $this->_setBoolKeys)) { + $method = array_search($offset, $this->_setBoolKeys); + $this->_call('set'.$method, array($value)); + } + + if(in_array($offset, $this->_setIntegerKeys)) { + $method = array_search($offset, $this->_setIntegerKeys); + $this->_call('set'.$method, array($value)); + } + + if(in_array($offset, $this->_setStringKeys)) { + $method = array_search($offset, $this->_setStringKeys); + $this->_call('set'.$method, array($value)); + } + + if(in_array($offset, $this->_setArrayKeys)) { + $method = array_search($offset, $this->_setArrayKeys); + $this->_call('set'.$method, array($value)); + } + + if(in_array($offset, $this->_setFileKeys)) { + $method = array_search($offset, $this->_setFileKeys); + $this->_call('set'.$method, array($value)); + } + + if(in_array($offset, $this->_setCallbackKeys)) { + $method = array_search($offset, $this->_setCallbackKeys); + $this->_call('set'.$method, array($value)); + } + } + } + + /** + * unsets using the ArrayAccess interface + * + * @param number + * @return bool + */ + public function offsetUnset($offset) { + unset($this->_option[$offset]); + } + + /** + * Send the curl off + * + * @return this + */ + public function send() { + $curl = curl_init(); + + $this->_addParameters()->_addHeaders(); + curl_setopt_array($curl, $this->_options); + curl_exec($curl); + + $this->_meta = array( + 'info' => curl_getinfo($curl, CURLINFO_HTTP_CODE), + 'error_message' => curl_errno($curl), + 'error_code' => curl_error($curl)); + + curl_close($curl); + unset($curl); + + return $this; + } + + /** + * Curl has problems handling custom request types + * from misconfigured end points or vice versa. + * When default cURL fails, try a custom GET instead + * + * @return this + */ + public function setCustomGet() { + $this->setCustomRequest(self::GET); + return $this; + } + + /** + * Curl has problems handling custom request types + * from misconfigured end points or vice versa. + * When default cURL fails, try a custom POST instead + * + * @return this + */ + public function setCustomPost() { + $this->setCustomRequest(self::POST); + return $this; + } + + /** + * Curl has problems handling custom request types + * from misconfigured end points or vice versa. + * When default cURL fails, try a custom PUT instead + * + * @return this + */ + public function setCustomPut() { + $this->setCustomRequest(self::PUT); + return $this; + } + + /** + * Curl has problems handling custom request types + * from misconfigured end points or vice versa. + * When default cURL fails, try a custom DELETE instead + * + * @return this + */ + public function setCustomDelete() { + $this->setCustomRequest(self::DELETE); + return $this; + } + + /** + * CURLOPT_POSTFIELDS accepts array and string + * arguments, this is a special case that __call + * does not handle + * + * @param string|array + * @return this + */ + public function setPostFields($fields) { + //argument 1 must be a string or array + Eden_Curl_Error::i()->argument(1, 'array', 'string'); + $this->_options[CURLOPT_POSTFIELDS] = $fields; + + return $this; + } + + /** + * Sets request headers + * + * @param array|string + * @return this + */ + public function setHeaders($key, $value = NULL) { + Eden_Curl_Error::i() + ->argument(1, 'array', 'string') + ->argument(2, 'scalar','null'); + + if(is_array($key)) { + $this->_headers = $key; + return $this; + } + + $this->_headers[] = $key.': '.$value; + return $this; + } + + /** + * Sets url parameter + * + * @param array|string + * @return this + */ + public function setUrlParameter($key, $value = NULL) { + Eden_Curl_Error::i() + ->argument(1, 'array', 'string') + ->argument(2, 'scalar'); + + if(is_array($key)) { + $this->_param = $key; + return $this; + } + + $this->_param[$key] = $value; + } + + /** + * Sets CURLOPT_SSL_VERIFYHOST + * + * @param bool + * @return this + */ + public function verifyHost($on = true) { + Eden_Curl_Error::i()->argument(1, 'bool'); + $this->_options[CURLOPT_SSL_VERIFYHOST] = $on ? 1 : 2; + return $this; + } + + /** + * Sets CURLOPT_SSL_VERIFYPEER + * + * @param bool + * @return this + */ + public function verifyPeer($on = true) { + Eden_Curl_Error::i()->argument(1, 'bool'); + $this->_options[CURLOPT_SSL_VERIFYPEER] = $on; + return $this; + } + + /* Protected Methods + -------------------------------*/ + protected function _addHeaders() { + if(empty($this->_headers)) { + return $this; + } + + $this->_options[CURLOPT_HTTPHEADER] = $this->_headers; + return $this; + } + + protected function _addParameters() { + if(empty($this->_params)) { + return $this; + } + + $params = http_build_query($this->_params); + if($this->_options[CURLOPT_POST]) { + $this->_options[CURLOPT_POSTFIELDS] = $params; + return $this; + } + + //if there is a question mark in the url + if(strpos($this->_options[CURLOPT_URL], '?') === false) { + //add the question mark + $params = '?'.$params; + //else if the question mark is not at the end + } else if(substr($this->_options[CURLOPT_URL], -1, 1) != '?') { + //append the parameters to the end + //with the other parameters + $params = '&'.$params; + } + + //append the parameters + $this->_options[CURLOPT_URL] .= $params; + + return $this; + } + + /* Private Methods + -------------------------------*/ +} + +/** + * cUrl Errors + */ +class Eden_Curl_Error extends Eden_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/error.php b/library/eden/error.php index 6cccfe4..caee8a4 100755 --- a/library/eden/error.php +++ b/library/eden/error.php @@ -1,554 +1,554 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * The base class for any class handling exceptions. Exceptions - * allow an application to custom handle errors that would - * normally let the system handle. This exception allows you to - * specify error levels and error types. Also using this exception - * outputs a trace (can be turned off) that shows where the problem - * started to where the program stopped. - * - * @package Eden - * @category error - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Error extends Exception { - /* Constants - -------------------------------*/ - const REFLECTION_ERROR = 'Error creating Reflection Class: %s, Method: %s.'; - const INVALID_ARGUMENT = 'Argument %d in %s() was expecting %s, however %s was given.'; - - //error type - const ARGUMENT = 'ARGUMENT'; //used when argument is invalidated - const LOGIC = 'LOGIC'; //used when logic is invalidated - const GENERAL = 'GENERAL'; //used when anything in general is invalidated - const CRITICAL = 'CRITICAL'; //used when anything caused application to crash - - //error level - const WARNING = 'WARNING'; - const ERROR = 'ERROR'; - const DEBUG = 'DEBUG'; //used for temporary developer output - const INFORMATION = 'INFORMATION'; //used for permanent developer notes - - const DEBUG_NOT_STRING = 'Debug was expecting a string'; - const DEBUG_NOT_PROPERTY = 'Debug: %s is not a property of %s'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_reporter = NULL; - protected $_type = NULL; - protected $_level = NULL; - protected $_offset = 1; - protected $_variables = array(); - protected $_trace = array(); - - protected static $_argumentTest = true; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - public function __construct($message = NULL, $code = 0) { - $this->_type = self::LOGIC; - $this->_level = self::ERROR; - - parent::__construct($message, $code); - } - - /* Public Methods - -------------------------------*/ - /** - * Adds parameters used in the message - * - * @return this - */ - public function addVariable($variable) { - $this->_variables[] = $variable; - return $this; - } - - /** - * Tests arguments for valid data types - * - * @param *int - * @param *mixed - * @param *string[,string..] - * @return this - */ - public function argument($index, $types) { - //if no test - if(!self::$_argumentTest) { - return $this; - } - - $trace = debug_backtrace(); - $trace = $trace[1]; - $types = func_get_args(); - $index = array_shift($types) - 1; - - if($index < 0) { - $index = 0; - } - - //if it's not set then it's good because the default value - //set in the method will be it. - if($index >= count($trace['args'])) { - return $this; - } - - $argument = $trace['args'][$index]; - - foreach($types as $i => $type) { - if($this->_isValid($type, $argument)) { - return $this; - } - } - - //lets formulate the method - $method = $trace['function']; - if(isset($trace['class'])) { - $method = $trace['class'].'->'.$method; - } - - $type = $this->_getType($argument); - - $this->setMessage(self::INVALID_ARGUMENT) - ->addVariable($index + 1) - ->addVariable($method) - ->addVariable(implode(' or ', $types)) - ->addVariable($type) - ->setTypeLogic() - ->setTraceOffset(1) - ->trigger(); - } - - /** - * Returns the exception level - * - * @return string - */ - public function getLevel() { - return $this->_level; - } - - /** - * Returns raw trace - * - * @return array - */ - public function getRawTrace() { - return $this->_trace; - } - - /** - * REturns the class or method that caught this - * - * @return string - */ - public function getReporter() { - return $this->_reporter; - } - - /** - * Returns the trace offset; where we should start the trace - * - * @return this - */ - public function getTraceOffset() { - return $this->_offset; - } - - /** - * Returns the exception type - * - * @return string - */ - public function getType() { - return $this->_type; - } - - /** - * Returns variables - * - * @return array - */ - public function getVariables() { - return $this->_variables; - } - - /** - * In a perfect production environment, - * we can assume that arguments passed in - * all methods are valid. To increase - * performance call this method. - * - * @return this - */ - public function noArgTest() { - self::$_argumentTest = false; - return $this; - } - - /** - * Sets exception level - * - * @param string - * @return this - */ - public function setLevel($level) { - $this->_level = $level; - return $this; - } - - /** - * Sets exception level to DEBUG - * - * @return this - */ - public function setLevelDebug() { - return $this->setLevel(self::DEBUG); - } - - /** - * Sets exception level to ERROR - * - * @return this - */ - public function setLevelError() { - return $this->setLevel(self::WARNING); - } - - /** - * Sets exception level to INFORMATION - * - * @return this - */ - public function setLevelInformation() { - return $this->setLevel(self::INFORMATION); - } - - /** - * Sets exception level to WARNING - * - * @return this - */ - public function setLevelWarning() { - return $this->setLevel(self::WARNING); - } - - /** - * Sets message - * - * @param string - * @return this - */ - public function setMessage($message) { - $this->message = $message; - return $this; - } - - /** - * Sets what index the trace should start at - * - * @return this - */ - public function setTraceOffset($offset) { - $this->_offset = $offset; - return $this; - } - - /** - * Sets exception type - * - * @param string - * @return this - */ - public function setType($type) { - $this->_type = $type; - return $this; - } - - /** - * Sets exception type to ARGUMENT - * - * @return this - */ - public function setTypeArgument() { - return $this->setType(self::ARGUMENT); - } - - /** - * Sets exception type to CRITICAL - * - * @return this - */ - public function setTypeCritical() { - return $this->setType(self::CRITICAL); - } - - /** - * Sets exception type to GENERAL - * - * @return this - */ - public function setTypeGeneral() { - return $this->setType(self::GENERAL); - } - - /** - * Sets exception type to LOGIC - * - * @return this - */ - public function setTypeLogic() { - return $this->setType(self::CRITICAL); - } - - /** - * Combines parameters with message and throws it - * - * @return void - */ - public function trigger() { - $this->_trace = debug_backtrace(); - - $this->_reporter = get_class($this); - if(isset($this->_trace[$this->_offset]['class'])) { - $this->_reporter = $this->_trace[$this->_offset]['class']; - } - - if(isset($this->_trace[$this->_offset]['file'])) { - $this->file = $this->_trace[$this->_offset]['file']; - } - - if(isset($this->_trace[$this->_offset]['line'])) { - $this->line = $this->_trace[$this->_offset]['line']; - } - - if(!empty($this->_variables)) { - $this->message = vsprintf($this->message, $this->_variables); - $this->_variables = array(); - } - - throw $this; - } - - /** - * Tests virtual arguments for valid data types - * - * @param *int - * @param *mixed - * @param *string[,string..] - * @return this - */ - public function vargument($method, $args, $index, $types) { - //if no test - if(!self::$_argumentTest) { - return $this; - } - - $trace = debug_backtrace(); - $trace = $trace[1]; - $types = func_get_args(); - $method = array_shift($types); - $args = array_shift($types); - $index = array_shift($types) - 1; - - if($index < 0) { - $index = 0; - } - - //if it's not set then it's good because the default value - //set in the method will be it. - if($index >= count($args)) { - return $this; - } - - $argument = $args[$index]; - - foreach($types as $i => $type) { - if($this->_isValid($type, $argument)) { - return $this; - } - } - - $method = $trace['class'].'->'.$method; - - $type = $this->_getType($argument); - - $this->setMessage(self::INVALID_ARGUMENT) - ->addVariable($index + 1) - ->addVariable($method) - ->addVariable(implode(' or ', $types)) - ->addVariable($type) - ->setTypeLogic() - ->setTraceOffset(1) - ->trigger(); - } - - /* Protected Methods - -------------------------------*/ - protected function _isCreditCard($value) { - return preg_match('/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]'. - '{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-'. - '5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/', $value); - } - - protected function _isEmail($value) { - return preg_match('/^(?:(?:(?:[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]|\x5c(?=[@,"\[\]'. - '\x5c\x00-\x20\x7f-\xff]))(?:[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]|(?<=\x5c)[@,"\[\]'. - '\x5c\x00-\x20\x7f-\xff]|\x5c(?=[@,"\[\]\x5c\x00-\x20\x7f-\xff])|\.(?=[^\.])){1,62'. - '}(?:[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]|(?<=\x5c)[@,"\[\]\x5c\x00-\x20\x7f-\xff])|'. - '[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]{1,2})|"(?:[^"]|(?<=\x5c)"){1,62}")@(?:(?!.{64})'. - '(?:[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.?|[a-zA-Z0-9]\.?)+\.(?:xn--[a-zA-Z0-9]'. - '+|[a-zA-Z]{2,6})|\[(?:[0-1]?\d?\d|2[0-4]\d|25[0-5])(?:\.(?:[0-1]?\d?\d|2[0-4]\d|25'. - '[0-5])){3}\])$/', $value); - } - - protected function _isHex($value) { - return preg_match("/^[0-9a-fA-F]{6}$/", $value); - } - - protected function _isHtml($value) { - return preg_match("/<\/?\w+((\s+(\w|\w[\w-]*\w)(\s*=\s*". - "(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i", $value); - } - - protected function _isUrl($value) { - return preg_match('/^(http|https|ftp):\/\/([A-Z0-9][A-Z0'. - '-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?\/?/i', $value); - } - - public function _alphaNum($value) { - return preg_match('/^[a-zA-Z0-9]+$/', $value); - } - - public function _alphaNumScore($value) { - return preg_match('/^[a-zA-Z0-9_]+$/', $value); - } - - public function _alphaNumHyphen($value) { - return preg_match('/^[a-zA-Z0-9-]+$/', $value); - } - - public function _alphaNumLine($value) { - return preg_match('/^[a-zA-Z0-9-_]+$/', $value); - } - - protected function _isValid($type, $data) { - $type = $this->_getTypeName($type); - - switch($type) { - case 'number': - return is_numeric($data); - case 'int': - return is_numeric($data) && strpos((string) $data, '.') === false; - case 'float': - return is_numeric($data) && strpos((string) $data, '.') !== false; - case 'file': - return is_string($data) && file_exists($data); - case 'folder': - return is_string($data) && is_dir($data); - case 'email': - return is_string($data) && $this->_isEmail($data); - case 'url': - return is_string($data) && $this->_isUrl($data); - case 'html': - return is_string($data) && $this->_isHtml($data); - case 'cc': - return (is_string($data) || is_int($data)) && $this->_isCreditCard($data); - case 'hex': - return is_string($data) && $this->_isHex($data); - case 'alphanum': - return is_string($data) && $this->_alphaNum($data); - case 'alphanumscore': - return is_string($data) && $this->_alphaNumScore($data); - case 'alphanumhyphen': - return is_string($data) && $this->_alphaNumHyphen($data); - case 'alphanumline': - return is_string($data) && $this->_alphaNumLine($data); - default: break; - } - - $method = 'is_'.$type; - if(function_exists($method)) { - return $method($data); - } - - if(class_exists($type)) { - return $data instanceof $type; - } - - return true; - } - - /* Private Methods - -------------------------------*/ - private function _getType($data) { - if(is_string($data)) { - return "'".$data."'"; - } - - if(is_numeric($data)) { - return $data; - } - - if(is_array($data)) { - return 'Array'; - } - - if(is_bool($data)) { - return $data ? 'true' : 'false'; - } - - if(is_object($data)) { - return get_class($data); - } - - if(is_null($data)) { - return 'null'; - } - - return 'unknown'; - } - - private function _getTypeName($data) { - if(is_string($data)) { - return $data; - } - - if(is_numeric($data)) { - return 'numeric'; - } - - if(is_array($data)) { - return 'array'; - } - - if(is_bool($data)) { - return 'bool'; - } - - if(is_object($data)) { - return get_class($data); - } - - if(is_null($data)) { - return 'null'; - } - } + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * The base class for any class handling exceptions. Exceptions + * allow an application to custom handle errors that would + * normally let the system handle. This exception allows you to + * specify error levels and error types. Also using this exception + * outputs a trace (can be turned off) that shows where the problem + * started to where the program stopped. + * + * @package Eden + * @category error + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Error extends Exception { + /* Constants + -------------------------------*/ + const REFLECTION_ERROR = 'Error creating Reflection Class: %s, Method: %s.'; + const INVALID_ARGUMENT = 'Argument %d in %s() was expecting %s, however %s was given.'; + + //error type + const ARGUMENT = 'ARGUMENT'; //used when argument is invalidated + const LOGIC = 'LOGIC'; //used when logic is invalidated + const GENERAL = 'GENERAL'; //used when anything in general is invalidated + const CRITICAL = 'CRITICAL'; //used when anything caused application to crash + + //error level + const WARNING = 'WARNING'; + const ERROR = 'ERROR'; + const DEBUG = 'DEBUG'; //used for temporary developer output + const INFORMATION = 'INFORMATION'; //used for permanent developer notes + + const DEBUG_NOT_STRING = 'Debug was expecting a string'; + const DEBUG_NOT_PROPERTY = 'Debug: %s is not a property of %s'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_reporter = NULL; + protected $_type = NULL; + protected $_level = NULL; + protected $_offset = 1; + protected $_variables = array(); + protected $_trace = array(); + + protected static $_argumentTest = true; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + public function __construct($message = NULL, $code = 0) { + $this->_type = self::LOGIC; + $this->_level = self::ERROR; + + parent::__construct($message, $code); + } + + /* Public Methods + -------------------------------*/ + /** + * Adds parameters used in the message + * + * @return this + */ + public function addVariable($variable) { + $this->_variables[] = $variable; + return $this; + } + + /** + * Tests arguments for valid data types + * + * @param *int + * @param *mixed + * @param *string[,string..] + * @return this + */ + public function argument($index, $types) { + //if no test + if(!self::$_argumentTest) { + return $this; + } + + $trace = debug_backtrace(); + $trace = $trace[1]; + $types = func_get_args(); + $index = array_shift($types) - 1; + + if($index < 0) { + $index = 0; + } + + //if it's not set then it's good because the default value + //set in the method will be it. + if($index >= count($trace['args'])) { + return $this; + } + + $argument = $trace['args'][$index]; + + foreach($types as $i => $type) { + if($this->_isValid($type, $argument)) { + return $this; + } + } + + //lets formulate the method + $method = $trace['function']; + if(isset($trace['class'])) { + $method = $trace['class'].'->'.$method; + } + + $type = $this->_getType($argument); + + $this->setMessage(self::INVALID_ARGUMENT) + ->addVariable($index + 1) + ->addVariable($method) + ->addVariable(implode(' or ', $types)) + ->addVariable($type) + ->setTypeLogic() + ->setTraceOffset(1) + ->trigger(); + } + + /** + * Returns the exception level + * + * @return string + */ + public function getLevel() { + return $this->_level; + } + + /** + * Returns raw trace + * + * @return array + */ + public function getRawTrace() { + return $this->_trace; + } + + /** + * REturns the class or method that caught this + * + * @return string + */ + public function getReporter() { + return $this->_reporter; + } + + /** + * Returns the trace offset; where we should start the trace + * + * @return this + */ + public function getTraceOffset() { + return $this->_offset; + } + + /** + * Returns the exception type + * + * @return string + */ + public function getType() { + return $this->_type; + } + + /** + * Returns variables + * + * @return array + */ + public function getVariables() { + return $this->_variables; + } + + /** + * In a perfect production environment, + * we can assume that arguments passed in + * all methods are valid. To increase + * performance call this method. + * + * @return this + */ + public function noArgTest() { + self::$_argumentTest = false; + return $this; + } + + /** + * Sets exception level + * + * @param string + * @return this + */ + public function setLevel($level) { + $this->_level = $level; + return $this; + } + + /** + * Sets exception level to DEBUG + * + * @return this + */ + public function setLevelDebug() { + return $this->setLevel(self::DEBUG); + } + + /** + * Sets exception level to ERROR + * + * @return this + */ + public function setLevelError() { + return $this->setLevel(self::WARNING); + } + + /** + * Sets exception level to INFORMATION + * + * @return this + */ + public function setLevelInformation() { + return $this->setLevel(self::INFORMATION); + } + + /** + * Sets exception level to WARNING + * + * @return this + */ + public function setLevelWarning() { + return $this->setLevel(self::WARNING); + } + + /** + * Sets message + * + * @param string + * @return this + */ + public function setMessage($message) { + $this->message = $message; + return $this; + } + + /** + * Sets what index the trace should start at + * + * @return this + */ + public function setTraceOffset($offset) { + $this->_offset = $offset; + return $this; + } + + /** + * Sets exception type + * + * @param string + * @return this + */ + public function setType($type) { + $this->_type = $type; + return $this; + } + + /** + * Sets exception type to ARGUMENT + * + * @return this + */ + public function setTypeArgument() { + return $this->setType(self::ARGUMENT); + } + + /** + * Sets exception type to CRITICAL + * + * @return this + */ + public function setTypeCritical() { + return $this->setType(self::CRITICAL); + } + + /** + * Sets exception type to GENERAL + * + * @return this + */ + public function setTypeGeneral() { + return $this->setType(self::GENERAL); + } + + /** + * Sets exception type to LOGIC + * + * @return this + */ + public function setTypeLogic() { + return $this->setType(self::CRITICAL); + } + + /** + * Combines parameters with message and throws it + * + * @return void + */ + public function trigger() { + $this->_trace = debug_backtrace(); + + $this->_reporter = get_class($this); + if(isset($this->_trace[$this->_offset]['class'])) { + $this->_reporter = $this->_trace[$this->_offset]['class']; + } + + if(isset($this->_trace[$this->_offset]['file'])) { + $this->file = $this->_trace[$this->_offset]['file']; + } + + if(isset($this->_trace[$this->_offset]['line'])) { + $this->line = $this->_trace[$this->_offset]['line']; + } + + if(!empty($this->_variables)) { + $this->message = vsprintf($this->message, $this->_variables); + $this->_variables = array(); + } + + throw $this; + } + + /** + * Tests virtual arguments for valid data types + * + * @param *int + * @param *mixed + * @param *string[,string..] + * @return this + */ + public function vargument($method, $args, $index, $types) { + //if no test + if(!self::$_argumentTest) { + return $this; + } + + $trace = debug_backtrace(); + $trace = $trace[1]; + $types = func_get_args(); + $method = array_shift($types); + $args = array_shift($types); + $index = array_shift($types) - 1; + + if($index < 0) { + $index = 0; + } + + //if it's not set then it's good because the default value + //set in the method will be it. + if($index >= count($args)) { + return $this; + } + + $argument = $args[$index]; + + foreach($types as $i => $type) { + if($this->_isValid($type, $argument)) { + return $this; + } + } + + $method = $trace['class'].'->'.$method; + + $type = $this->_getType($argument); + + $this->setMessage(self::INVALID_ARGUMENT) + ->addVariable($index + 1) + ->addVariable($method) + ->addVariable(implode(' or ', $types)) + ->addVariable($type) + ->setTypeLogic() + ->setTraceOffset(1) + ->trigger(); + } + + /* Protected Methods + -------------------------------*/ + protected function _isCreditCard($value) { + return preg_match('/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]'. + '{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-'. + '5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/', $value); + } + + protected function _isEmail($value) { + return preg_match('/^(?:(?:(?:[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]|\x5c(?=[@,"\[\]'. + '\x5c\x00-\x20\x7f-\xff]))(?:[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]|(?<=\x5c)[@,"\[\]'. + '\x5c\x00-\x20\x7f-\xff]|\x5c(?=[@,"\[\]\x5c\x00-\x20\x7f-\xff])|\.(?=[^\.])){1,62'. + '}(?:[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]|(?<=\x5c)[@,"\[\]\x5c\x00-\x20\x7f-\xff])|'. + '[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]{1,2})|"(?:[^"]|(?<=\x5c)"){1,62}")@(?:(?!.{64})'. + '(?:[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.?|[a-zA-Z0-9]\.?)+\.(?:xn--[a-zA-Z0-9]'. + '+|[a-zA-Z]{2,6})|\[(?:[0-1]?\d?\d|2[0-4]\d|25[0-5])(?:\.(?:[0-1]?\d?\d|2[0-4]\d|25'. + '[0-5])){3}\])$/', $value); + } + + protected function _isHex($value) { + return preg_match("/^[0-9a-fA-F]{6}$/", $value); + } + + protected function _isHtml($value) { + return preg_match("/<\/?\w+((\s+(\w|\w[\w-]*\w)(\s*=\s*". + "(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i", $value); + } + + protected function _isUrl($value) { + return preg_match('/^(http|https|ftp):\/\/([A-Z0-9][A-Z0'. + '-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?\/?/i', $value); + } + + public function _alphaNum($value) { + return preg_match('/^[a-zA-Z0-9]+$/', $value); + } + + public function _alphaNumScore($value) { + return preg_match('/^[a-zA-Z0-9_]+$/', $value); + } + + public function _alphaNumHyphen($value) { + return preg_match('/^[a-zA-Z0-9-]+$/', $value); + } + + public function _alphaNumLine($value) { + return preg_match('/^[a-zA-Z0-9-_]+$/', $value); + } + + protected function _isValid($type, $data) { + $type = $this->_getTypeName($type); + + switch($type) { + case 'number': + return is_numeric($data); + case 'int': + return is_numeric($data) && strpos((string) $data, '.') === false; + case 'float': + return is_numeric($data) && strpos((string) $data, '.') !== false; + case 'file': + return is_string($data) && file_exists($data); + case 'folder': + return is_string($data) && is_dir($data); + case 'email': + return is_string($data) && $this->_isEmail($data); + case 'url': + return is_string($data) && $this->_isUrl($data); + case 'html': + return is_string($data) && $this->_isHtml($data); + case 'cc': + return (is_string($data) || is_int($data)) && $this->_isCreditCard($data); + case 'hex': + return is_string($data) && $this->_isHex($data); + case 'alphanum': + return is_string($data) && $this->_alphaNum($data); + case 'alphanumscore': + return is_string($data) && $this->_alphaNumScore($data); + case 'alphanumhyphen': + return is_string($data) && $this->_alphaNumHyphen($data); + case 'alphanumline': + return is_string($data) && $this->_alphaNumLine($data); + default: break; + } + + $method = 'is_'.$type; + if(function_exists($method)) { + return $method($data); + } + + if(class_exists($type)) { + return $data instanceof $type; + } + + return true; + } + + /* Private Methods + -------------------------------*/ + private function _getType($data) { + if(is_string($data)) { + return "'".$data."'"; + } + + if(is_numeric($data)) { + return $data; + } + + if(is_array($data)) { + return 'Array'; + } + + if(is_bool($data)) { + return $data ? 'true' : 'false'; + } + + if(is_object($data)) { + return get_class($data); + } + + if(is_null($data)) { + return 'null'; + } + + return 'unknown'; + } + + private function _getTypeName($data) { + if(is_string($data)) { + return $data; + } + + if(is_numeric($data)) { + return 'numeric'; + } + + if(is_array($data)) { + return 'array'; + } + + if(is_bool($data)) { + return 'bool'; + } + + if(is_object($data)) { + return get_class($data); + } + + if(is_null($data)) { + return 'null'; + } + } } \ No newline at end of file diff --git a/library/eden/eventbrite.php b/library/eden/eventbrite.php index 9e631ee..a7a241e 100644 --- a/library/eden/eventbrite.php +++ b/library/eden/eventbrite.php @@ -1,218 +1,218 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/oauth2.php'; -require_once dirname(__FILE__).'/eventbrite/error.php'; -require_once dirname(__FILE__).'/eventbrite/base.php'; -require_once dirname(__FILE__).'/eventbrite/oauth.php'; -require_once dirname(__FILE__).'/eventbrite/discount.php'; -require_once dirname(__FILE__).'/eventbrite/event.php'; -require_once dirname(__FILE__).'/eventbrite/organizer.php'; -require_once dirname(__FILE__).'/eventbrite/payment.php'; -require_once dirname(__FILE__).'/eventbrite/ticket.php'; -require_once dirname(__FILE__).'/eventbrite/user.php'; -require_once dirname(__FILE__).'/eventbrite/venue.php'; -require_once dirname(__FILE__).'/eventbrite/event/search.php'; -require_once dirname(__FILE__).'/eventbrite/event/set.php'; - -/** - * Eventbrite API factory. This is a factory class with - * methods that will load up different Eventbrite classes. - * Eventbrite classes are organized as described on their - * developer site: discount, event, organizer, payment, - * ticket, user, venue. We also added a search class and - * set class with advanced options for searching and - * creating events. - * - * @package Eden - * @category tool - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Eventbrite extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns Eventbrite Oauth - * - * @param string client ID - * @param string app secret - * @return Eden_Eventbrite_Discount - */ - public function auth($clientId, $appSecret, $redirect) { - Eden_Eventbrite_Error::i() - ->argument(1, 'string', 'int') - ->argument(2, 'string') - ->argument(3, 'string'); - - return Eden_Eventbrite_Oauth::i((string) $clientId, $appSecret, $redirect); - } - - /** - * Returns Eventbrite Discount - * - * @param string - * @param string|null - * @return Eden_Eventbrite_Discount - */ - public function discount($user, $api = NULL) { - //argument test - Eden_Eventbrite_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string', 'null'); //Argument 2 must be a string or null - - return Eden_Eventbrite_Discount::i($user, $api); - } - - /** - * Returns Eventbrite Event - * - * @param string - * @param string|null - * @return Eden_Eventbrite_Event - */ - public function event($user, $api = NULL) { - //argument test - Eden_Eventbrite_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string', 'null'); //Argument 2 must be a string or null - - return Eden_Eventbrite_Event::i($user, $api); - } - - /** - * Returns Eventbrite Organizer - * - * @param string - * @param string|null - * @return Eden_Eventbrite_Organizer - */ - public function organizer($user, $api = NULL) { - //argument test - Eden_Eventbrite_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string', 'null'); //Argument 2 must be a string or null - - return Eden_Eventbrite_Organizer::i($user, $api); - } - - /** - * Returns Eventbrite Payment - * - * @param string - * @param string|null - * @return Eden_Eventbrite_Payment - */ - public function payment($user, $api = NULL) { - //argument test - Eden_Eventbrite_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string', 'null'); //Argument 2 must be a string or null - - return Eden_Eventbrite_Payment::i($user, $api); - } - - /** - * Returns Eventbrite Search - * - * @param string - * @param string|null - * @return Eden_Eventbrite_Venue - */ - public function search($user, $api = NULL) { - //argument test - Eden_Eventbrite_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string', 'null'); //Argument 2 must be a string or null - - return Eden_Eventbrite_Event_Search::i($user, $api); - } - - /** - * Returns Eventbrite Set - * - * @param string - * @param string|null - * @return Eden_Eventbrite_Venue - */ - public function set($user, $api = NULL) { - //argument test - Eden_Eventbrite_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string', 'null'); //Argument 2 must be a string or null - - return Eden_Eventbrite_Event_Set::i($user, $api); - } - - /** - * Returns Eventbrite Ticket - * - * @param string - * @param string|null - * @return Eden_Eventbrite_Ticket - */ - public function ticket($user, $api = NULL) { - //argument test - Eden_Eventbrite_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string', 'null'); //Argument 2 must be a string or null - - return Eden_Eventbrite_Ticket::i($user, $api); - } - - /** - * Returns Eventbrite User - * - * @param string - * @param string|null - * @return Eden_Eventbrite_User - */ - public function user($user, $api = NULL) { - //argument test - Eden_Eventbrite_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string', 'null'); //Argument 2 must be a string or null - - return Eden_Eventbrite_User::i($user, $api); - } - - /** - * Returns Eventbrite Venue - * - * @param string - * @param string|null - * @return Eden_Eventbrite_Venue - */ - public function venue($user, $api = NULL) { - //argument test - Eden_Eventbrite_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string', 'null'); //Argument 2 must be a string or null - - return Eden_Eventbrite_Venue::i($user, $api); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/oauth2.php'; +require_once dirname(__FILE__).'/eventbrite/error.php'; +require_once dirname(__FILE__).'/eventbrite/base.php'; +require_once dirname(__FILE__).'/eventbrite/oauth.php'; +require_once dirname(__FILE__).'/eventbrite/discount.php'; +require_once dirname(__FILE__).'/eventbrite/event.php'; +require_once dirname(__FILE__).'/eventbrite/organizer.php'; +require_once dirname(__FILE__).'/eventbrite/payment.php'; +require_once dirname(__FILE__).'/eventbrite/ticket.php'; +require_once dirname(__FILE__).'/eventbrite/user.php'; +require_once dirname(__FILE__).'/eventbrite/venue.php'; +require_once dirname(__FILE__).'/eventbrite/event/search.php'; +require_once dirname(__FILE__).'/eventbrite/event/set.php'; + +/** + * Eventbrite API factory. This is a factory class with + * methods that will load up different Eventbrite classes. + * Eventbrite classes are organized as described on their + * developer site: discount, event, organizer, payment, + * ticket, user, venue. We also added a search class and + * set class with advanced options for searching and + * creating events. + * + * @package Eden + * @category tool + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Eventbrite extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns Eventbrite Oauth + * + * @param string client ID + * @param string app secret + * @return Eden_Eventbrite_Discount + */ + public function auth($clientId, $appSecret, $redirect) { + Eden_Eventbrite_Error::i() + ->argument(1, 'string', 'int') + ->argument(2, 'string') + ->argument(3, 'string'); + + return Eden_Eventbrite_Oauth::i((string) $clientId, $appSecret, $redirect); + } + + /** + * Returns Eventbrite Discount + * + * @param string + * @param string|null + * @return Eden_Eventbrite_Discount + */ + public function discount($user, $api = NULL) { + //argument test + Eden_Eventbrite_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string', 'null'); //Argument 2 must be a string or null + + return Eden_Eventbrite_Discount::i($user, $api); + } + + /** + * Returns Eventbrite Event + * + * @param string + * @param string|null + * @return Eden_Eventbrite_Event + */ + public function event($user, $api = NULL) { + //argument test + Eden_Eventbrite_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string', 'null'); //Argument 2 must be a string or null + + return Eden_Eventbrite_Event::i($user, $api); + } + + /** + * Returns Eventbrite Organizer + * + * @param string + * @param string|null + * @return Eden_Eventbrite_Organizer + */ + public function organizer($user, $api = NULL) { + //argument test + Eden_Eventbrite_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string', 'null'); //Argument 2 must be a string or null + + return Eden_Eventbrite_Organizer::i($user, $api); + } + + /** + * Returns Eventbrite Payment + * + * @param string + * @param string|null + * @return Eden_Eventbrite_Payment + */ + public function payment($user, $api = NULL) { + //argument test + Eden_Eventbrite_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string', 'null'); //Argument 2 must be a string or null + + return Eden_Eventbrite_Payment::i($user, $api); + } + + /** + * Returns Eventbrite Search + * + * @param string + * @param string|null + * @return Eden_Eventbrite_Venue + */ + public function search($user, $api = NULL) { + //argument test + Eden_Eventbrite_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string', 'null'); //Argument 2 must be a string or null + + return Eden_Eventbrite_Event_Search::i($user, $api); + } + + /** + * Returns Eventbrite Set + * + * @param string + * @param string|null + * @return Eden_Eventbrite_Venue + */ + public function set($user, $api = NULL) { + //argument test + Eden_Eventbrite_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string', 'null'); //Argument 2 must be a string or null + + return Eden_Eventbrite_Event_Set::i($user, $api); + } + + /** + * Returns Eventbrite Ticket + * + * @param string + * @param string|null + * @return Eden_Eventbrite_Ticket + */ + public function ticket($user, $api = NULL) { + //argument test + Eden_Eventbrite_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string', 'null'); //Argument 2 must be a string or null + + return Eden_Eventbrite_Ticket::i($user, $api); + } + + /** + * Returns Eventbrite User + * + * @param string + * @param string|null + * @return Eden_Eventbrite_User + */ + public function user($user, $api = NULL) { + //argument test + Eden_Eventbrite_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string', 'null'); //Argument 2 must be a string or null + + return Eden_Eventbrite_User::i($user, $api); + } + + /** + * Returns Eventbrite Venue + * + * @param string + * @param string|null + * @return Eden_Eventbrite_Venue + */ + public function venue($user, $api = NULL) { + //argument test + Eden_Eventbrite_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string', 'null'); //Argument 2 must be a string or null + + return Eden_Eventbrite_Venue::i($user, $api); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/eventbrite/base.php b/library/eden/eventbrite/base.php index 57f88d3..6ef66e5 100644 --- a/library/eden/eventbrite/base.php +++ b/library/eden/eventbrite/base.php @@ -1,122 +1,122 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Eventbrite Base - * - * @package Eden - * @category eventbrite - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Eventbrite_Base extends Eden_Class { - /* Constants - -------------------------------*/ - const ACCESS_HEADER = 'Authorization: Bearer %s'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_user = NULL; - protected $_api = NULL; - protected $_meta = array(); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public function __construct($user, $api = NULL) { - //argument test - Eden_Eventbrite_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string', 'null'); //Argument 2 must be a string or null - - $this->_api = $api; - $this->_user = $user; - } - - /* Public Methods - -------------------------------*/ - /** - * Returns the meta of the last call - * - * @return array - */ - public function getMeta($key = NULL) { - Eden_Eventbrite_Error::i()->argument(1, 'string', 'null'); - - if(isset($this->_meta[$key])) { - return $this->_meta[$key]; - } - - return $this->_meta; - } - - /* Protected Methods - -------------------------------*/ - protected function _getJsonResponse($url, array $query = array()) { - $response = $this->_getResponse($url, $query); - return json_decode($response, true); - } - - protected function _getResponse($url, array $query = array()) { - $headers = array(); - $headers[] = 'Content-Type: application/json'; - - //if api key is null - if(is_null($this->_api)) { - //we must have an oauth token - $headers[] = sprintf(self::ACCESS_HEADER, $this->_user); - } else { - $query['app_key'] = $this->_api; - $query['user_key'] = $this->_user; - } - - $query = http_build_query($query); - - //determine the conector - $connector = NULL; - - //if there is no question mark - if(strpos($url, '?') === false) { - $connector = '?'; - //if the redirect doesn't end with a question mark - } else if(substr($url, -1) != '?') { - $connector = '&'; - } - - //now add the authorization to the url - $url .= $connector.$query; - - //set curl - $curl = Eden_Curl::i() - ->verifyHost(false) - ->verifyPeer(false) - ->setUrl($url) - ->setHeaders($headers); - - //get the response - $response = $curl->getResponse(); - - $this->_meta = $curl->getMeta(); - $this->_meta['url'] = $url; - $this->_meta['headers'] = $headers; - $this->_meta['query'] = $query; - - return $response; - } - - protected function _getXmlResponse($url, array $query = array()) { - $response = $this->_getResponse($url, $query); - return simplexml_load_string($response); - } - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Eventbrite Base + * + * @package Eden + * @category eventbrite + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Eventbrite_Base extends Eden_Class { + /* Constants + -------------------------------*/ + const ACCESS_HEADER = 'Authorization: Bearer %s'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_user = NULL; + protected $_api = NULL; + protected $_meta = array(); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public function __construct($user, $api = NULL) { + //argument test + Eden_Eventbrite_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string', 'null'); //Argument 2 must be a string or null + + $this->_api = $api; + $this->_user = $user; + } + + /* Public Methods + -------------------------------*/ + /** + * Returns the meta of the last call + * + * @return array + */ + public function getMeta($key = NULL) { + Eden_Eventbrite_Error::i()->argument(1, 'string', 'null'); + + if(isset($this->_meta[$key])) { + return $this->_meta[$key]; + } + + return $this->_meta; + } + + /* Protected Methods + -------------------------------*/ + protected function _getJsonResponse($url, array $query = array()) { + $response = $this->_getResponse($url, $query); + return json_decode($response, true); + } + + protected function _getResponse($url, array $query = array()) { + $headers = array(); + $headers[] = 'Content-Type: application/json'; + + //if api key is null + if(is_null($this->_api)) { + //we must have an oauth token + $headers[] = sprintf(self::ACCESS_HEADER, $this->_user); + } else { + $query['app_key'] = $this->_api; + $query['user_key'] = $this->_user; + } + + $query = http_build_query($query); + + //determine the conector + $connector = NULL; + + //if there is no question mark + if(strpos($url, '?') === false) { + $connector = '?'; + //if the redirect doesn't end with a question mark + } else if(substr($url, -1) != '?') { + $connector = '&'; + } + + //now add the authorization to the url + $url .= $connector.$query; + + //set curl + $curl = Eden_Curl::i() + ->verifyHost(false) + ->verifyPeer(false) + ->setUrl($url) + ->setHeaders($headers); + + //get the response + $response = $curl->getResponse(); + + $this->_meta = $curl->getMeta(); + $this->_meta['url'] = $url; + $this->_meta['headers'] = $headers; + $this->_meta['query'] = $query; + + return $response; + } + + protected function _getXmlResponse($url, array $query = array()) { + $response = $this->_getResponse($url, $query); + return simplexml_load_string($response); + } + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/eventbrite/discount.php b/library/eden/eventbrite/discount.php index 2fd3238..01f9ef6 100644 --- a/library/eden/eventbrite/discount.php +++ b/library/eden/eventbrite/discount.php @@ -1,194 +1,194 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Eventbrite new or update discount - * - * @package Eden - * @category eventbrite - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Eventbrite_Discount extends Eden_Eventbrite_Base { - /* Constants - -------------------------------*/ - const URL_NEW = 'https://www.eventbrite.com/json/discount_new'; - const URL_UPDATE = 'https://www.eventbrite.com/json/discount_update'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_query = array(); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Creates the discount - * - * @param int the event id - * @return array - */ - public function create($event) { - //Argument 1 must be int - Eden_Eventbrite_Error::i()->argument(1, 'int'); - - $query = $this->_query; - $query['event_id'] = $event; - return $this->_getJsonResponse(self::URL_NEW, $query); - } - - /** - * Sets the discount amount - * - * @param float|int - * @return this - */ - public function setAmountOff($amount) { - //Argument 1 must be int - Eden_Eventbrite_Error::i()->argument(1, 'float', 'int'); - - $this->_query['amount_off'] = $amount; - - return $this; - } - - /** - * Sets the discount code - * - * @param string - * @return this - */ - public function setCode($code) { - //Argument 1 must be int - Eden_Eventbrite_Error::i()->argument(1, 'string'); - - $this->_query['code'] = $code; - - return $this; - } - - /** - * Set the end time - * - * @param string|int - * @return this - */ - public function setEnd($end) { - //Argument 1 must be a string - Eden_Eventbrite_Error::i()->argument(1, 'string', 'int'); - - if(is_string($end)) { - $end = strtotime($end); - } - - $end = date('Y-m-d H:i:s', $end); - - $this->_query['end_date'] = $end; - - return $this; - } - - /** - * Sets the discount percent - * - * @param float|int - * @return this - */ - public function setPercentOff($percent) { - //Argument 1 must be int - Eden_Eventbrite_Error::i()->argument(1, 'int', 'float'); - - $this->_query['percent_off'] = $percent; - - return $this; - } - - /** - * Set quantity - * - * @param int - * @return this - */ - public function setQuantity($quantity) { - //Argument 1 must be int - Eden_Eventbrite_Error::i()->argument(1, 'int'); - - $this->_query['quantity_available'] = $quantity; - - return $this; - } - - /** - * Set the start time - * - * @param int|string - * @return this - */ - public function setStart($start) { - //Argument 1 must be a string - Eden_Eventbrite_Error::i()->argument(1, 'string', 'int'); - - if(is_string($start)) { - $start = strtotime($start); - } - - $start = date('Y-m-d H:i:s', $start); - - $this->_query['start_date'] = $start; - - return $this; - } - - /** - * Set ticket ID or a list of ticket IDs - * - * @param string|array - * @return this - */ - public function setTickets($tickets) { - //Argument 1 must be int - Eden_Eventbrite_Error::i()->argument(1, 'string', 'array'); - - if(is_array($tickets)) { - $tickets = implode(',', $tickets); - } - - $this->_query['tickets'] = $tickets; - - return $this; - } - - /** - * Creates the discount - * - * @param int the discount id - * @return array - */ - public function update($id) { - //Argument 1 must be int - Eden_Eventbrite_Error::i()->argument(1, 'int'); - - $query = $this->_query; - $query['id'] = $id; - return $this->_getJsonResponse(self::URL_UPDATE, $query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Eventbrite new or update discount + * + * @package Eden + * @category eventbrite + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Eventbrite_Discount extends Eden_Eventbrite_Base { + /* Constants + -------------------------------*/ + const URL_NEW = 'https://www.eventbrite.com/json/discount_new'; + const URL_UPDATE = 'https://www.eventbrite.com/json/discount_update'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_query = array(); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Creates the discount + * + * @param int the event id + * @return array + */ + public function create($event) { + //Argument 1 must be int + Eden_Eventbrite_Error::i()->argument(1, 'int'); + + $query = $this->_query; + $query['event_id'] = $event; + return $this->_getJsonResponse(self::URL_NEW, $query); + } + + /** + * Sets the discount amount + * + * @param float|int + * @return this + */ + public function setAmountOff($amount) { + //Argument 1 must be int + Eden_Eventbrite_Error::i()->argument(1, 'float', 'int'); + + $this->_query['amount_off'] = $amount; + + return $this; + } + + /** + * Sets the discount code + * + * @param string + * @return this + */ + public function setCode($code) { + //Argument 1 must be int + Eden_Eventbrite_Error::i()->argument(1, 'string'); + + $this->_query['code'] = $code; + + return $this; + } + + /** + * Set the end time + * + * @param string|int + * @return this + */ + public function setEnd($end) { + //Argument 1 must be a string + Eden_Eventbrite_Error::i()->argument(1, 'string', 'int'); + + if(is_string($end)) { + $end = strtotime($end); + } + + $end = date('Y-m-d H:i:s', $end); + + $this->_query['end_date'] = $end; + + return $this; + } + + /** + * Sets the discount percent + * + * @param float|int + * @return this + */ + public function setPercentOff($percent) { + //Argument 1 must be int + Eden_Eventbrite_Error::i()->argument(1, 'int', 'float'); + + $this->_query['percent_off'] = $percent; + + return $this; + } + + /** + * Set quantity + * + * @param int + * @return this + */ + public function setQuantity($quantity) { + //Argument 1 must be int + Eden_Eventbrite_Error::i()->argument(1, 'int'); + + $this->_query['quantity_available'] = $quantity; + + return $this; + } + + /** + * Set the start time + * + * @param int|string + * @return this + */ + public function setStart($start) { + //Argument 1 must be a string + Eden_Eventbrite_Error::i()->argument(1, 'string', 'int'); + + if(is_string($start)) { + $start = strtotime($start); + } + + $start = date('Y-m-d H:i:s', $start); + + $this->_query['start_date'] = $start; + + return $this; + } + + /** + * Set ticket ID or a list of ticket IDs + * + * @param string|array + * @return this + */ + public function setTickets($tickets) { + //Argument 1 must be int + Eden_Eventbrite_Error::i()->argument(1, 'string', 'array'); + + if(is_array($tickets)) { + $tickets = implode(',', $tickets); + } + + $this->_query['tickets'] = $tickets; + + return $this; + } + + /** + * Creates the discount + * + * @param int the discount id + * @return array + */ + public function update($id) { + //Argument 1 must be int + Eden_Eventbrite_Error::i()->argument(1, 'int'); + + $query = $this->_query; + $query['id'] = $id; + return $this->_getJsonResponse(self::URL_UPDATE, $query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/eventbrite/error.php b/library/eden/eventbrite/error.php index ac4ffb4..05086c2 100644 --- a/library/eden/eventbrite/error.php +++ b/library/eden/eventbrite/error.php @@ -1,60 +1,60 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Eventbrite Errors - * - * @package Eden - * @category eventbrite - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Eventbrite_Error extends Eden_Error { - /* Constants - -------------------------------*/ - const TITLE_NOT_SET = 'You tried to set an event without setting a title. Call setTitle() before send()'; - const START_NOT_SET = 'You tried to set an event without setting a start date. Call setStart() before send()'; - const END_NOT_SET = 'You tried to set an event without setting an end date. Call setEnd() before send()'; - const ZONE_NOT_SET = 'You tried to set an event without setting a timezone. Call setTimezone() before send()'; - - const PRIVACY_NOT_SET = 'You tried to set an event without setting the privacy. Call setPublic() or setPrivate() before send()'; - const URL_NOT_SET = 'You tried to set an event without setting a personal url. Call setUrl() before send()'; - const ORGANIZER_NOT_SET = 'You tried to set an event without setting an orgaizer. Call setOrganizer() before send()'; - const VENUE_NOT_SET = 'You tried to set an event without setting a venue. Call setVenue() before send()'; - const CAPACITY_NOT_SET = 'You tried to set an event without setting the capacity. Call setCapacity() before send()'; - const CURRENCY_NOT_SET = 'You tried to set an event without setting a currency. Call setCurrency() before send()'; - const INVALID_PASSWORD = 'Password must be 4 characters or greater!'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - protected function _isValid($type, $data) { - if($type == 'gmt') { - return preg_match('/^GMT(\-|\+)[0-9]{2,4}$/', $data); - } - - return parent::_isValid($type, $data); - } - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Eventbrite Errors + * + * @package Eden + * @category eventbrite + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Eventbrite_Error extends Eden_Error { + /* Constants + -------------------------------*/ + const TITLE_NOT_SET = 'You tried to set an event without setting a title. Call setTitle() before send()'; + const START_NOT_SET = 'You tried to set an event without setting a start date. Call setStart() before send()'; + const END_NOT_SET = 'You tried to set an event without setting an end date. Call setEnd() before send()'; + const ZONE_NOT_SET = 'You tried to set an event without setting a timezone. Call setTimezone() before send()'; + + const PRIVACY_NOT_SET = 'You tried to set an event without setting the privacy. Call setPublic() or setPrivate() before send()'; + const URL_NOT_SET = 'You tried to set an event without setting a personal url. Call setUrl() before send()'; + const ORGANIZER_NOT_SET = 'You tried to set an event without setting an orgaizer. Call setOrganizer() before send()'; + const VENUE_NOT_SET = 'You tried to set an event without setting a venue. Call setVenue() before send()'; + const CAPACITY_NOT_SET = 'You tried to set an event without setting the capacity. Call setCapacity() before send()'; + const CURRENCY_NOT_SET = 'You tried to set an event without setting a currency. Call setCurrency() before send()'; + const INVALID_PASSWORD = 'Password must be 4 characters or greater!'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + protected function _isValid($type, $data) { + if($type == 'gmt') { + return preg_match('/^GMT(\-|\+)[0-9]{2,4}$/', $data); + } + + return parent::_isValid($type, $data); + } + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/eventbrite/oauth.php b/library/eden/eventbrite/oauth.php index 99c31d5..e613709 100644 --- a/library/eden/eventbrite/oauth.php +++ b/library/eden/eventbrite/oauth.php @@ -1,53 +1,53 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Eventbrite oauth - * - * @package Eden - * @category eventbrite - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Eventbrite_Oauth extends Eden_Oauth2_Client { - /* Constants - -------------------------------*/ - const REQUEST_URL = 'https://www.eventbrite.com/oauth/authorize'; - const ACCESS_URL = 'https://www.eventbrite.com/oauth/token'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($clientId, $appSecret, $redirect) { - //argument test - Eden_Eventbrite_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string'); //Argument 3 must be a string - - parent::__construct($clientId, $appSecret, $redirect, self::REQUEST_URL, self::ACCESS_URL); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Eventbrite oauth + * + * @package Eden + * @category eventbrite + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Eventbrite_Oauth extends Eden_Oauth2_Client { + /* Constants + -------------------------------*/ + const REQUEST_URL = 'https://www.eventbrite.com/oauth/authorize'; + const ACCESS_URL = 'https://www.eventbrite.com/oauth/token'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($clientId, $appSecret, $redirect) { + //argument test + Eden_Eventbrite_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string'); //Argument 3 must be a string + + parent::__construct($clientId, $appSecret, $redirect, self::REQUEST_URL, self::ACCESS_URL); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/facebook.php b/library/eden/facebook.php index 29feae0..fccb53b 100644 --- a/library/eden/facebook.php +++ b/library/eden/facebook.php @@ -1,148 +1,148 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/oauth2.php'; -require_once dirname(__FILE__).'/facebook/error.php'; -require_once dirname(__FILE__).'/facebook/auth.php'; -require_once dirname(__FILE__).'/facebook/graph.php'; -require_once dirname(__FILE__).'/facebook/post.php'; -require_once dirname(__FILE__).'/facebook/event.php'; -require_once dirname(__FILE__).'/facebook/link.php'; -require_once dirname(__FILE__).'/facebook/select.php'; -require_once dirname(__FILE__).'/facebook/search.php'; -require_once dirname(__FILE__).'/facebook/fql.php'; - -/** - * Facebook API factory. This is a factory class with - * methods that will load up different Facebook classes. - * Facebook classes are organized as described on their - * developer site: auth, graph, FQL. We also added a post - * class for more advanced options when posting to Facebook. - * - * @package Eden - * @category facebook - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Facebook extends Eden_Class { - /* Constants - -------------------------------*/ - const RSS = 'https://www.facebook.com/feeds/page.php?id=%s&format=rss20'; - const RSS_AGENT = 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns Facebook Auth - * - * @param string - * @param string - * @param string - * @return Eden_Facebook_Auth - */ - public function auth($key, $secret, $redirect) { - Eden_Facebook_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string'); - - return Eden_Facebook_Auth::i($key, $secret, $redirect); - } - - /** - * Add an event - * - * @param string - * @param string - * @param string|int - * @param string|int - * @return Eden_Facebook_Event - */ - public function event($token, $name, $start, $end) { - return Eden_Facebook_Event::i($token, $name, $start, $end); - } - - /** - * Returns Facebook FQL - * - * @param string - * @return Eden_Facebook_Fql - */ - public function fql($token) { - Eden_Facebook_Error::i()->argument(1, 'string'); - return Eden_Facebook_Fql::i($token); - } - - /** - * Returns Facebook Graph - * - * @param string - * @return Eden_Facebook_Graph - */ - public function graph($token) { - Eden_Facebook_Error::i()->argument(1, 'string'); - return Eden_Facebook_Graph::i($token); - } - - /** - * Add a link - * - * @param string - * @param string - * @return Eden_Facebook_Post - */ - public function link($token, $url) { - return Eden_Facebook_Link::i($token, $url); - } - - /** - * Returns Facebook Post - * - * @param string - * @param string - * @return Eden_Facebook_Post - */ - public function post($token, $message) { - return Eden_Facebook_Post::i($token, $message); - } - - /** - * Returns an RSS feed to a public id - * - * @param int - * @return SimpleXml - */ - public function rss($id) { - Eden_Facebook_Error::i()->argument(1, 'int'); - return Eden_Curl::i() - ->setUrl(sprintf(self::RSS, $id)) - ->setUserAgent(self::RSS_AGENT) - ->setConnectTimeout(10) - ->setFollowLocation(true) - ->setTimeout(60) - ->verifyPeer(false) - ->getSimpleXmlResponse(); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/oauth2.php'; +require_once dirname(__FILE__).'/facebook/error.php'; +require_once dirname(__FILE__).'/facebook/auth.php'; +require_once dirname(__FILE__).'/facebook/graph.php'; +require_once dirname(__FILE__).'/facebook/post.php'; +require_once dirname(__FILE__).'/facebook/event.php'; +require_once dirname(__FILE__).'/facebook/link.php'; +require_once dirname(__FILE__).'/facebook/select.php'; +require_once dirname(__FILE__).'/facebook/search.php'; +require_once dirname(__FILE__).'/facebook/fql.php'; + +/** + * Facebook API factory. This is a factory class with + * methods that will load up different Facebook classes. + * Facebook classes are organized as described on their + * developer site: auth, graph, FQL. We also added a post + * class for more advanced options when posting to Facebook. + * + * @package Eden + * @category facebook + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Facebook extends Eden_Class { + /* Constants + -------------------------------*/ + const RSS = 'https://www.facebook.com/feeds/page.php?id=%s&format=rss20'; + const RSS_AGENT = 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns Facebook Auth + * + * @param string + * @param string + * @param string + * @return Eden_Facebook_Auth + */ + public function auth($key, $secret, $redirect) { + Eden_Facebook_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string'); + + return Eden_Facebook_Auth::i($key, $secret, $redirect); + } + + /** + * Add an event + * + * @param string + * @param string + * @param string|int + * @param string|int + * @return Eden_Facebook_Event + */ + public function event($token, $name, $start, $end) { + return Eden_Facebook_Event::i($token, $name, $start, $end); + } + + /** + * Returns Facebook FQL + * + * @param string + * @return Eden_Facebook_Fql + */ + public function fql($token) { + Eden_Facebook_Error::i()->argument(1, 'string'); + return Eden_Facebook_Fql::i($token); + } + + /** + * Returns Facebook Graph + * + * @param string + * @return Eden_Facebook_Graph + */ + public function graph($token) { + Eden_Facebook_Error::i()->argument(1, 'string'); + return Eden_Facebook_Graph::i($token); + } + + /** + * Add a link + * + * @param string + * @param string + * @return Eden_Facebook_Post + */ + public function link($token, $url) { + return Eden_Facebook_Link::i($token, $url); + } + + /** + * Returns Facebook Post + * + * @param string + * @param string + * @return Eden_Facebook_Post + */ + public function post($token, $message) { + return Eden_Facebook_Post::i($token, $message); + } + + /** + * Returns an RSS feed to a public id + * + * @param int + * @return SimpleXml + */ + public function rss($id) { + Eden_Facebook_Error::i()->argument(1, 'int'); + return Eden_Curl::i() + ->setUrl(sprintf(self::RSS, $id)) + ->setUserAgent(self::RSS_AGENT) + ->setConnectTimeout(10) + ->setFollowLocation(true) + ->setTimeout(60) + ->verifyPeer(false) + ->getSimpleXmlResponse(); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/facebook/auth.php b/library/eden/facebook/auth.php index c64263f..8058437 100644 --- a/library/eden/facebook/auth.php +++ b/library/eden/facebook/auth.php @@ -1,56 +1,56 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package.st. - */ - -/** - * Facebook Authentication - * - * @package Eden - * @category facebook - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Facebook_Auth extends Eden_Oauth2_Client { - /* Constants - -------------------------------*/ - const REQUEST_URL = 'https://www.facebook.com/dialog/oauth'; - const ACCESS_URL = 'https://graph.facebook.com/oauth/access_token'; - const USER_AGENT = 'facebook-php-3.1'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_key = NULL; - protected $_secret = NULL; - protected $_redirect = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($key, $secret, $redirect) { - //argument test - Eden_Facebook_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string'); //Argument 4 must be a string - - parent::__construct($key, $secret, $redirect, self::REQUEST_URL, self::ACCESS_URL); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package.st. + */ + +/** + * Facebook Authentication + * + * @package Eden + * @category facebook + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Facebook_Auth extends Eden_Oauth2_Client { + /* Constants + -------------------------------*/ + const REQUEST_URL = 'https://www.facebook.com/dialog/oauth'; + const ACCESS_URL = 'https://graph.facebook.com/oauth/access_token'; + const USER_AGENT = 'facebook-php-3.1'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_key = NULL; + protected $_secret = NULL; + protected $_redirect = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($key, $secret, $redirect) { + //argument test + Eden_Facebook_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string'); //Argument 4 must be a string + + parent::__construct($key, $secret, $redirect, self::REQUEST_URL, self::ACCESS_URL); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/facebook/columns.php b/library/eden/facebook/columns.php index 1edd052..7420e30 100644 --- a/library/eden/facebook/columns.php +++ b/library/eden/facebook/columns.php @@ -1,288 +1,288 @@ - -return array( - 'album' => array( - 'aid', 'object_id', 'owner', - 'cover_pid', 'cover_object_id', 'name', - 'created', 'modified', 'description', - 'location', 'size', 'link', - 'visible', 'modified_major', 'edit_link', - 'type', 'can_upload', 'photo_count', - 'video_count'), - 'application' => array( - 'app_id', 'api_key', - 'canvas_name', 'display_name', - 'icon_url', 'logo_url', - 'company_name', 'developers', - 'description', 'daily_active_users', - 'weekly_active_users', 'monthly_active_users', - 'category', 'subcategory', - 'is_facebook_app', 'restriction_info', - 'app_domains', 'auth_dialog_data_help_url', - 'auth_dialog_description', 'auth_dialog_headline', - 'auth_dialog_perms_explanation', 'auth_referral_user_perms', - 'auth_referral_friend_perms', 'auth_referral_default_activity_privacy', - 'auth_referral_enabled', 'auth_referral_extended_perms', - 'auth_referral_response_type', 'canvas_fluid_height', - 'canvas_fluid_width', 'canvas_url', - 'contact_email', 'created_time', - 'creator_uid', 'deauth_callback_url', - 'iphone_app_store_id', 'hosting_url', - 'mobile_web_url', 'page_tab_default_name', - 'page_tab_url', 'privacy_policy_url', - 'secure_canvas_url', 'secure_page_tab_url', - 'server_ip_whitelist', 'social_discovery', - 'terms_of_service_url', 'update_ip_whitelist', - 'user_support_email', 'user_support_url', - 'website_url'), - 'apprequest' => array( - 'request_id', 'app_id', 'recipient_uid', - 'sender_uid', 'message', 'data', - 'created_time'), - 'checkin' => array( - 'checkin_id', 'author_uid', 'page_id', - 'app_id', 'post_id', 'coords', - 'timestamp', 'tagged_uids', 'message'), - 'comment' => array( - 'xid', 'object_id', 'post_id', - 'fromid', 'time', 'text', - 'id', 'username ', 'reply_xid', - 'post_fbid', 'app_id', 'likes', - 'comments', 'user_likes', 'is_private'), - 'comments_info' => array( - 'app_id', 'xid', - 'count', 'updated_time'), - 'connection' => array( - 'source_id', 'target_id', - 'target_type', 'is_following'), - 'cookies' => array( - 'uid', 'name', 'value', - 'expires', 'path'), - 'developer' => array('developer_id', 'application_id', 'role'), - 'domain' => array('domain_id', 'domain_name'), - 'domain_admin' => array('owner_id', 'domain_id'), - 'event' => array( - 'eid', 'name', 'tagline', - 'nid', 'pic_small', 'pic_big', - 'pic_square', 'pic', 'host', - 'description', 'event_type', 'event_subtype', - 'start_time', 'end_time', 'creator', - 'update_time', 'location', 'venue', - 'privacy', 'hide_guest_list', 'can_invite_friends'), - 'event_member' => array( - 'uid', 'eid', - 'rsvp_status', 'start_time'), - 'family' => array( - 'profile_id', 'uid', - 'name', 'birthday', - 'relationship'), - 'friend' => array('uid1', 'uid2'), - 'friend_request' => array( - 'uid_to', 'uid_from', - 'time', 'message', - 'unread'), - 'friendlist' => array('owner', 'flid', 'name'), - 'friendlist_member' => array('flid', 'uid'), - 'group' => array( - 'gid', 'name', 'nid', - 'pic_small', 'pic_big', 'pic', - 'description', 'group_type', 'group_subtype', - 'recent_news', 'creator', 'update_time', - 'office', 'website', 'venue', - 'privacy', 'icon', 'icon34', - 'icon68', 'email', 'version'), - 'group_member' => array( - 'uid', 'gid', 'administrator', - 'positions', 'unread', 'bookmark_order'), - 'insights' => array('object_id', 'metric', 'end_time', 'period', 'value'), - 'like' => array('object_id', 'post_id', 'user_id', 'object_type'), - 'link' => array( - 'link_id', 'owner', 'owner_comment', - 'created_time', 'title', 'summary', - 'url', 'picture', 'image_urls'), - 'link_stat' => array( - 'url', 'normalized_url', 'share_count', - 'like_count', 'comment_count', 'total_count', - 'click_count', 'comments_fbid', 'commentsbox_count'), - 'mailbox_folder' => array( - 'folder_id', 'viewer_id', 'name', - 'unread_count', 'total_count'), - 'message' => array( - 'message_id', 'thread_id', 'author_id', - 'body', 'created_time', 'attachment', - 'viewer_id'), - 'note' => array( - 'uid', 'note_id', 'created_time', - 'updated_time', 'content', 'content_html', - 'title'), - 'notification' => array( - 'notification_id', 'sender_id', 'recipient_id', - 'created_time', 'updated_time', 'title_html', - 'title_text', 'body_html', 'body_text', - 'href', 'app_id', 'is_unread', - 'is_hidden', 'object_id', 'object_type', - 'icon_url'), - 'object_url' => array( - 'url', 'id', - 'type', 'site'), - 'page' => array( - 'page_id', 'name', 'username', - 'description', 'categories', 'is_community_page', - 'pic_small', 'pic_big', 'pic_square', - 'pic', 'pic_large', 'page_url', - 'fan_count', 'type', 'website', - 'has_added_app', 'general_info', 'can_post', - 'checkins', 'founded', 'company_overview', - 'mission', 'products', 'location', - 'parking', 'hours', 'pharma_safety_info', - 'public_transit', 'attire', 'payment_options', - 'culinary_team', 'general_manager', 'price_range', - 'restaurant_services', 'restaurant_specialties', 'phone', - 'release_date', 'genre', 'starring', - 'screenplay_by', 'directed_by', 'produced_by', - 'studio', 'awards', 'plot_outline', - 'season', 'network', 'schedule', - 'written_by', 'band_members', 'hometown', - 'current_location', 'record_label', 'booking_agent', - 'press_contact', 'artists_we_like', 'influences', - 'band_interests', 'bio', 'affiliation', - 'birthday', 'personal_info', 'personal_interests', - 'built', 'features', 'mpg'), - 'page_admin' => array('uid', 'page_id', 'type'), - 'page_blocked_user' => array('page_id', 'uid'), - 'page_fan' => array( - 'uid', 'page_id', - 'type', 'profile_section', - 'created_time'), - 'permissions' => array('uid', 'PERMISSION_NAME'), - 'permissions_info' => array('permission_name', 'header', 'summary'), - 'photo' => array( - 'pid', 'aid', 'owner', - 'src_small', 'src_small_width', 'src_small_height', - 'src_big', 'src_big_width', 'src_big_height', - 'src', 'src_width', 'src_height', - 'link', 'caption', 'created', - 'modified', 'position', 'object_id', - 'album_object_id', 'images'), - 'photo_tag' => array( - 'pid', 'subject', 'object_id', - 'text', 'xcoord', 'ycoord', - 'created'), - 'place' => array( - 'page_id', 'name', 'description', - 'geometry', 'latitude', 'longitude', - 'checkin_count', 'display_subtext'), - 'privacy' => array( - 'id', 'object_id', 'value ', - 'description', 'allow', 'deny', - 'owner_id', 'networks', 'friends'), - 'privacy_setting' => array( - 'name', 'value ', 'description', - 'allow', 'deny', 'networks', - 'friends'), - 'profile' => array( - 'id', 'can_post', 'name', - 'url', 'pic', 'pic_square', - 'pic_small', 'pic_big', 'pic_crop', - 'type', 'username'), - 'question' => array( - 'id', 'owner', 'question', - 'created_time', 'updated_time'), - 'question_option' => array( - 'id', 'question_id', 'name', - 'votes', 'object_id', 'owner', - 'created_time'), - 'question_option_votes' => array('option_id', 'voter_id'), - 'review' => array( - 'reviewee_id', 'reviewer_id', 'review_id', - 'message', 'created_time', 'rating'), - 'standard_friend_info' => array('uid1', 'uid2'), - 'standard_user_info' => array( - 'uid', 'name', 'username', - 'third_party_id', 'first_name', 'last_name', - 'locale', 'affiliations', 'profile_url', - 'timezone', 'birthday', 'sex', - 'proxied_email', 'current_location', 'allowed_restrictions'), - 'status' => array( - 'uid', 'status_id', - 'time', 'source', - 'message'), - 'stream' => array( - 'post_id', 'viewer_id ', 'app_id', - 'source_id ', 'updated_time', 'created_time', - 'filter_key', 'attribution ', 'actor_id', - 'target_id', 'message', 'app_data', - 'action_links', 'attachment', 'impressions', - 'comments', 'likes', 'privacy', - 'permalink', 'xid', 'tagged_ids', - 'message_tags', 'description', 'description_tags'), - 'stream_filter' => array( - 'uid', 'filter_key ', 'name', - 'rank ', 'icon_url', 'is_visible', - 'type', 'value'), - 'stream_tag' => array('post_id', 'actor_id', 'target_id'), - 'thread' => array( - 'thread_id', 'folder_id', 'subject', - 'recipients', 'updated_time', 'parent_message_id', - 'parent_thread_id', 'message_count', 'snippet', - 'snippet_author', 'object_id', 'unread', - 'viewer_id'), - 'translation' => array( - 'locale', 'native_hash', 'native_string', - 'description', 'translation', 'approval_status', - 'pre_hash_string', 'best_string'), - 'unified_message' => array( - 'message_id', 'thread_id', 'subject', - 'body', 'unread', 'action_id', - 'timestamp', 'tags', 'sender', - 'recipients', 'object_sender', 'html_body', - 'attachments', 'attachment_map', 'shares', - 'share_map'), - 'unified_thread' => array( - 'action_id', 'archived', 'can_reply', - 'folder', 'former_participants', 'has_attachments', - 'is_subscribed', 'last_visible_add_action_id', 'name', - 'num_messages', 'num_unread', 'object_participants', - 'participants', 'senders', 'single_recipient', - 'snippet', 'snippet_sender', 'snippet_message_has_attachment', - 'subject', 'tags', 'thread_id', - 'thread_participants', 'timestamp', 'unread'), - 'unified_thread_action' => array( - 'action_id', 'actor', 'thread_id', - 'timestamp', 'type', 'users'), - 'unified_thread_count' => array( - 'folder', 'unread_count', 'unseen_count', - 'last_action_id', 'last_seen_time', 'total_threads'), - 'url_like' => array('user_id', 'url'), - 'user' => array( - 'uid', 'username', 'first_name', - 'middle_name', 'last_name', 'name', - 'pic_small', 'pic_big', 'pic_square', - 'pic', 'affiliations', 'profile_update_time', - 'timezone', 'religion', 'birthday', - 'birthday_date', 'sex', 'hometown_location', - 'meeting_sex', 'meeting_for', 'relationship_status', - 'significant_other_id', 'political', 'current_location', - 'activities', 'interests', 'is_app_user', - 'music', 'tv', 'movies', - 'books', 'quotes', 'about_me', - 'hs_info', 'education_history', 'work_history', - 'notes_count', 'wall_count', 'status', - 'has_added_app', 'online_presence', 'locale', - 'proxied_email', 'profile_url', 'email_hashes', - 'pic_small_with_logo', 'pic_big_with_logo', 'pic_square_with_logo', - 'pic_with_logo', 'allowed_restrictions', 'verified', - 'profile_blurb', 'family', 'website', - 'is_blocked', 'contact_email', 'email', - 'third_party_id', 'name_format', 'video_upload_limits', - 'games', 'is_minor', 'work', - 'education', 'sports', 'favorite_athletes', - 'favorite_teams', 'inspirational_people', 'languages', - 'likes_count', 'friend_count', 'mutual_friend_count', - 'can_post'), - 'video' => array( - 'vid', 'owner', 'album_id', - 'title', 'description', 'link', - 'thumbnail_link', 'embed_html', 'updated_time', - 'created_time', 'length', 'src', - 'src_hq'), + +return array( + 'album' => array( + 'aid', 'object_id', 'owner', + 'cover_pid', 'cover_object_id', 'name', + 'created', 'modified', 'description', + 'location', 'size', 'link', + 'visible', 'modified_major', 'edit_link', + 'type', 'can_upload', 'photo_count', + 'video_count'), + 'application' => array( + 'app_id', 'api_key', + 'canvas_name', 'display_name', + 'icon_url', 'logo_url', + 'company_name', 'developers', + 'description', 'daily_active_users', + 'weekly_active_users', 'monthly_active_users', + 'category', 'subcategory', + 'is_facebook_app', 'restriction_info', + 'app_domains', 'auth_dialog_data_help_url', + 'auth_dialog_description', 'auth_dialog_headline', + 'auth_dialog_perms_explanation', 'auth_referral_user_perms', + 'auth_referral_friend_perms', 'auth_referral_default_activity_privacy', + 'auth_referral_enabled', 'auth_referral_extended_perms', + 'auth_referral_response_type', 'canvas_fluid_height', + 'canvas_fluid_width', 'canvas_url', + 'contact_email', 'created_time', + 'creator_uid', 'deauth_callback_url', + 'iphone_app_store_id', 'hosting_url', + 'mobile_web_url', 'page_tab_default_name', + 'page_tab_url', 'privacy_policy_url', + 'secure_canvas_url', 'secure_page_tab_url', + 'server_ip_whitelist', 'social_discovery', + 'terms_of_service_url', 'update_ip_whitelist', + 'user_support_email', 'user_support_url', + 'website_url'), + 'apprequest' => array( + 'request_id', 'app_id', 'recipient_uid', + 'sender_uid', 'message', 'data', + 'created_time'), + 'checkin' => array( + 'checkin_id', 'author_uid', 'page_id', + 'app_id', 'post_id', 'coords', + 'timestamp', 'tagged_uids', 'message'), + 'comment' => array( + 'xid', 'object_id', 'post_id', + 'fromid', 'time', 'text', + 'id', 'username ', 'reply_xid', + 'post_fbid', 'app_id', 'likes', + 'comments', 'user_likes', 'is_private'), + 'comments_info' => array( + 'app_id', 'xid', + 'count', 'updated_time'), + 'connection' => array( + 'source_id', 'target_id', + 'target_type', 'is_following'), + 'cookies' => array( + 'uid', 'name', 'value', + 'expires', 'path'), + 'developer' => array('developer_id', 'application_id', 'role'), + 'domain' => array('domain_id', 'domain_name'), + 'domain_admin' => array('owner_id', 'domain_id'), + 'event' => array( + 'eid', 'name', 'tagline', + 'nid', 'pic_small', 'pic_big', + 'pic_square', 'pic', 'host', + 'description', 'event_type', 'event_subtype', + 'start_time', 'end_time', 'creator', + 'update_time', 'location', 'venue', + 'privacy', 'hide_guest_list', 'can_invite_friends'), + 'event_member' => array( + 'uid', 'eid', + 'rsvp_status', 'start_time'), + 'family' => array( + 'profile_id', 'uid', + 'name', 'birthday', + 'relationship'), + 'friend' => array('uid1', 'uid2'), + 'friend_request' => array( + 'uid_to', 'uid_from', + 'time', 'message', + 'unread'), + 'friendlist' => array('owner', 'flid', 'name'), + 'friendlist_member' => array('flid', 'uid'), + 'group' => array( + 'gid', 'name', 'nid', + 'pic_small', 'pic_big', 'pic', + 'description', 'group_type', 'group_subtype', + 'recent_news', 'creator', 'update_time', + 'office', 'website', 'venue', + 'privacy', 'icon', 'icon34', + 'icon68', 'email', 'version'), + 'group_member' => array( + 'uid', 'gid', 'administrator', + 'positions', 'unread', 'bookmark_order'), + 'insights' => array('object_id', 'metric', 'end_time', 'period', 'value'), + 'like' => array('object_id', 'post_id', 'user_id', 'object_type'), + 'link' => array( + 'link_id', 'owner', 'owner_comment', + 'created_time', 'title', 'summary', + 'url', 'picture', 'image_urls'), + 'link_stat' => array( + 'url', 'normalized_url', 'share_count', + 'like_count', 'comment_count', 'total_count', + 'click_count', 'comments_fbid', 'commentsbox_count'), + 'mailbox_folder' => array( + 'folder_id', 'viewer_id', 'name', + 'unread_count', 'total_count'), + 'message' => array( + 'message_id', 'thread_id', 'author_id', + 'body', 'created_time', 'attachment', + 'viewer_id'), + 'note' => array( + 'uid', 'note_id', 'created_time', + 'updated_time', 'content', 'content_html', + 'title'), + 'notification' => array( + 'notification_id', 'sender_id', 'recipient_id', + 'created_time', 'updated_time', 'title_html', + 'title_text', 'body_html', 'body_text', + 'href', 'app_id', 'is_unread', + 'is_hidden', 'object_id', 'object_type', + 'icon_url'), + 'object_url' => array( + 'url', 'id', + 'type', 'site'), + 'page' => array( + 'page_id', 'name', 'username', + 'description', 'categories', 'is_community_page', + 'pic_small', 'pic_big', 'pic_square', + 'pic', 'pic_large', 'page_url', + 'fan_count', 'type', 'website', + 'has_added_app', 'general_info', 'can_post', + 'checkins', 'founded', 'company_overview', + 'mission', 'products', 'location', + 'parking', 'hours', 'pharma_safety_info', + 'public_transit', 'attire', 'payment_options', + 'culinary_team', 'general_manager', 'price_range', + 'restaurant_services', 'restaurant_specialties', 'phone', + 'release_date', 'genre', 'starring', + 'screenplay_by', 'directed_by', 'produced_by', + 'studio', 'awards', 'plot_outline', + 'season', 'network', 'schedule', + 'written_by', 'band_members', 'hometown', + 'current_location', 'record_label', 'booking_agent', + 'press_contact', 'artists_we_like', 'influences', + 'band_interests', 'bio', 'affiliation', + 'birthday', 'personal_info', 'personal_interests', + 'built', 'features', 'mpg'), + 'page_admin' => array('uid', 'page_id', 'type'), + 'page_blocked_user' => array('page_id', 'uid'), + 'page_fan' => array( + 'uid', 'page_id', + 'type', 'profile_section', + 'created_time'), + 'permissions' => array('uid', 'PERMISSION_NAME'), + 'permissions_info' => array('permission_name', 'header', 'summary'), + 'photo' => array( + 'pid', 'aid', 'owner', + 'src_small', 'src_small_width', 'src_small_height', + 'src_big', 'src_big_width', 'src_big_height', + 'src', 'src_width', 'src_height', + 'link', 'caption', 'created', + 'modified', 'position', 'object_id', + 'album_object_id', 'images'), + 'photo_tag' => array( + 'pid', 'subject', 'object_id', + 'text', 'xcoord', 'ycoord', + 'created'), + 'place' => array( + 'page_id', 'name', 'description', + 'geometry', 'latitude', 'longitude', + 'checkin_count', 'display_subtext'), + 'privacy' => array( + 'id', 'object_id', 'value ', + 'description', 'allow', 'deny', + 'owner_id', 'networks', 'friends'), + 'privacy_setting' => array( + 'name', 'value ', 'description', + 'allow', 'deny', 'networks', + 'friends'), + 'profile' => array( + 'id', 'can_post', 'name', + 'url', 'pic', 'pic_square', + 'pic_small', 'pic_big', 'pic_crop', + 'type', 'username'), + 'question' => array( + 'id', 'owner', 'question', + 'created_time', 'updated_time'), + 'question_option' => array( + 'id', 'question_id', 'name', + 'votes', 'object_id', 'owner', + 'created_time'), + 'question_option_votes' => array('option_id', 'voter_id'), + 'review' => array( + 'reviewee_id', 'reviewer_id', 'review_id', + 'message', 'created_time', 'rating'), + 'standard_friend_info' => array('uid1', 'uid2'), + 'standard_user_info' => array( + 'uid', 'name', 'username', + 'third_party_id', 'first_name', 'last_name', + 'locale', 'affiliations', 'profile_url', + 'timezone', 'birthday', 'sex', + 'proxied_email', 'current_location', 'allowed_restrictions'), + 'status' => array( + 'uid', 'status_id', + 'time', 'source', + 'message'), + 'stream' => array( + 'post_id', 'viewer_id ', 'app_id', + 'source_id ', 'updated_time', 'created_time', + 'filter_key', 'attribution ', 'actor_id', + 'target_id', 'message', 'app_data', + 'action_links', 'attachment', 'impressions', + 'comments', 'likes', 'privacy', + 'permalink', 'xid', 'tagged_ids', + 'message_tags', 'description', 'description_tags'), + 'stream_filter' => array( + 'uid', 'filter_key ', 'name', + 'rank ', 'icon_url', 'is_visible', + 'type', 'value'), + 'stream_tag' => array('post_id', 'actor_id', 'target_id'), + 'thread' => array( + 'thread_id', 'folder_id', 'subject', + 'recipients', 'updated_time', 'parent_message_id', + 'parent_thread_id', 'message_count', 'snippet', + 'snippet_author', 'object_id', 'unread', + 'viewer_id'), + 'translation' => array( + 'locale', 'native_hash', 'native_string', + 'description', 'translation', 'approval_status', + 'pre_hash_string', 'best_string'), + 'unified_message' => array( + 'message_id', 'thread_id', 'subject', + 'body', 'unread', 'action_id', + 'timestamp', 'tags', 'sender', + 'recipients', 'object_sender', 'html_body', + 'attachments', 'attachment_map', 'shares', + 'share_map'), + 'unified_thread' => array( + 'action_id', 'archived', 'can_reply', + 'folder', 'former_participants', 'has_attachments', + 'is_subscribed', 'last_visible_add_action_id', 'name', + 'num_messages', 'num_unread', 'object_participants', + 'participants', 'senders', 'single_recipient', + 'snippet', 'snippet_sender', 'snippet_message_has_attachment', + 'subject', 'tags', 'thread_id', + 'thread_participants', 'timestamp', 'unread'), + 'unified_thread_action' => array( + 'action_id', 'actor', 'thread_id', + 'timestamp', 'type', 'users'), + 'unified_thread_count' => array( + 'folder', 'unread_count', 'unseen_count', + 'last_action_id', 'last_seen_time', 'total_threads'), + 'url_like' => array('user_id', 'url'), + 'user' => array( + 'uid', 'username', 'first_name', + 'middle_name', 'last_name', 'name', + 'pic_small', 'pic_big', 'pic_square', + 'pic', 'affiliations', 'profile_update_time', + 'timezone', 'religion', 'birthday', + 'birthday_date', 'sex', 'hometown_location', + 'meeting_sex', 'meeting_for', 'relationship_status', + 'significant_other_id', 'political', 'current_location', + 'activities', 'interests', 'is_app_user', + 'music', 'tv', 'movies', + 'books', 'quotes', 'about_me', + 'hs_info', 'education_history', 'work_history', + 'notes_count', 'wall_count', 'status', + 'has_added_app', 'online_presence', 'locale', + 'proxied_email', 'profile_url', 'email_hashes', + 'pic_small_with_logo', 'pic_big_with_logo', 'pic_square_with_logo', + 'pic_with_logo', 'allowed_restrictions', 'verified', + 'profile_blurb', 'family', 'website', + 'is_blocked', 'contact_email', 'email', + 'third_party_id', 'name_format', 'video_upload_limits', + 'games', 'is_minor', 'work', + 'education', 'sports', 'favorite_athletes', + 'favorite_teams', 'inspirational_people', 'languages', + 'likes_count', 'friend_count', 'mutual_friend_count', + 'can_post'), + 'video' => array( + 'vid', 'owner', 'album_id', + 'title', 'description', 'link', + 'thumbnail_link', 'embed_html', 'updated_time', + 'created_time', 'length', 'src', + 'src_hq'), 'video_tag' => array('vid', 'subject', 'updated_time', 'created_time')); \ No newline at end of file diff --git a/library/eden/facebook/error.php b/library/eden/facebook/error.php index 200da6f..33d18ea 100644 --- a/library/eden/facebook/error.php +++ b/library/eden/facebook/error.php @@ -1,40 +1,40 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Facebook Errors - * - * @package Eden - * @category facebook - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Facebook_Error extends Eden_Error { - /* Constants - -------------------------------*/ - const AUTHENTICATION_FAILED = 'Application authentication failed. Facebook returned %s: %s'; - const GRAPH_FAILED = 'Call to graph.facebook.com failed. Facebook returned %s: %s'; - const REQUIRES_AUTH = 'Call to %s requires authentication. Please set token first or set argument 4 in setObject() to false.'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Facebook Errors + * + * @package Eden + * @category facebook + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Facebook_Error extends Eden_Error { + /* Constants + -------------------------------*/ + const AUTHENTICATION_FAILED = 'Application authentication failed. Facebook returned %s: %s'; + const GRAPH_FAILED = 'Call to graph.facebook.com failed. Facebook returned %s: %s'; + const REQUIRES_AUTH = 'Call to %s requires authentication. Please set token first or set argument 4 in setObject() to false.'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/facebook/graph.php b/library/eden/facebook/graph.php index bbc1635..e5377a9 100644 --- a/library/eden/facebook/graph.php +++ b/library/eden/facebook/graph.php @@ -1,603 +1,603 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package.st. - */ - -/** - * Facebook Authentication - * - * @package Eden - * @category facebook - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Facebook_Graph extends Eden_Class { - /* Constants - -------------------------------*/ - const GRAPH_URL = 'https://graph.facebook.com/'; - const LOGOUT_URL = 'https://www.facebook.com/logout.php?next=%s&access_token=%s'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_token = NULL; - - protected $_list = array( - 'Friends', 'Home', - 'Feed', 'Likes', - 'Movies', 'Music', - 'Books', 'Photos', - 'Albums', 'Videos', - 'VideoUploads', 'Events', - 'Groups', 'Checkins'); - - protected $_search = array( - 'Posts', 'Users', - 'Pages', 'Likes', - 'Places', 'Events', - 'Groups', 'Checkins'); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __call($name, $args) { - //if the method starts with get - if(strpos($name, 'get') === 0 && in_array(substr($name, 3), $this->_list)) { - $key = preg_replace("/([A-Z])/", "/$1", $name); - //get rid of get - $key = strtolower(substr($key, 4)); - - $id = 'me'; - if(!empty($args)) { - $id = array_shift($args); - } - - array_unshift($args, $id, $key); - - return call_user_func_array(array($this, '_getList'), $args); - } else if(strpos($name, 'search') === 0 && in_array(substr($name, 6), $this->_search)) { - - //get rid of get - $key = strtolower(substr($name, 6)); - - array_unshift($args, $key); - - return call_user_func_array(array($this, '_search'), $args); - } - } - - public function __construct($token) { - $this->_token = $token; - } - /* Public Methods - -------------------------------*/ - - /** - * Add an album - * - * @param string|int the object ID to place the album - * @param string - * @param string the album description - * @return int the album ID - */ - public function addAlbum($id, $name, $message) { - //Argument test - Eden_Facebook_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string or integer - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string'); //Argument 3 must be a string - - //form the URL - $url = self::GRAPH_URL.$id.'/albums'; - $post = array('name'=>$name,'message'=>$message); - $query = array('access_token' => $this->_token); - $url .= '?'.http_build_query($query); - $results = json_decode($this->_call($url, $post), true); - - return $results['id']; - } - - /** - * Adds a comment to a post - * - * @param int the post ID commenting on - * @param string - * @return int the comment ID - */ - public function addComment($id, $message) { - //Argument test - Eden_Facebook_Error::i() - ->argument(1, 'int') //Argument 1 must be an integer - ->argument(2, 'string'); //Argument 2 must be a string - - //form the URL - $url = self::GRAPH_URL.$id.'/comments'; - $post = array('message' => $message); - $query = array('access_token' => $this->_token); - $url .= '?'.http_build_query($query); - $results = json_decode($this->_call($url, $post), true); - - return $results['id']; - } - - /** - * Attend an event - * - * @param int the event ID - * @return this - */ - public function attendEvent($id) { - Eden_Facebook_Error::i()->argument(1, 'int'); - - $url = self::GRAPH_URL.$id.'/attending'; - $query = array('access_token' => $this->_token); - $url .= '?'.http_build_query($query); - - json_decode($this->_call($url), true); - - return $this; - } - - /** - * Check into a place - * - * @param string|int the checkin ID - * @param string - * @param float - * @param float - * @param int the place ID - * @param string|array - * @return int - */ - public function checkin($id, $message, $latitude, $longitude, $place, $tags) { - //Argument test - Eden_Facebook_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string or integer - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'float') //Argument 3 must be a string - ->argument(4, 'float') //Argument 4 must be a string - ->argument(5, 'int') //Argument 5 must be a string - ->argument(6, 'string', 'array'); //Argument 6 must be a string - - $url = self::GRAPH_URL.$id.'/checkins'; - $post = array('message' => $message); - $query = array('access_token' => $this->_token); - $url .= '?'.http_build_query($query); - - //if message - if($message) { - //add it - $post['message'] = $message; - } - - //if coords - if($latitude && $longitute) { - //add it - $post['coordinates'] = json_encode(array( - 'latitude' => $latitude, - 'longitude' => $longitude)); - } - - //if place - if($place) { - //add it - $post['place'] = $place; - } - - //if tags - if($tags) { - //add it - $post['tags'] = $tags; - } - - $results = json_decode($this->_call($url, $post), true); - return $results['id']; - } - - /** - * Add a note - * - * @param int|string object ID where to put the note - * @param string - * @param string - * @return int - */ - public function createNote($id = 'me', $subject, $message) { - //Argument test - Eden_Facebook_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string or integer - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string'); //Argument 3 must be a string - - //form the URL - $url = self::GRAPH_URL.$id.'/notes'; - $post = array('subject' => $subject, 'message' => $message); - $query = array('access_token' => $this->_token); - $url .= '?'.http_build_query($query); - $results = json_decode($this->_call($url, $post), true); - - return $results['id']; - } - - /** - * Decline an event - * - * @param int event ID - * @return this - */ - public function declineEvent($id) { - Eden_Facebook_Error::i()->argument(1, 'int'); - $url = self::GRAPH_URL.$id.'/declined'; - $query = array('access_token' => $this->_token); - $url .= '?'.http_build_query($query); - - json_decode($this->_call($url), true); - - return $this; - } - - /** - * Add an event - * - * @param string name of event - * @param string|int string date or time format - * @param string|int string date or time format - * @return Eden_Facebook_Event - */ - public function event($name, $start, $end) { - return Eden_Facebook_Event::i($this->_token, $name, $start, $end); - } - /** - * Returns specific fields of an object - * - * @param string|int - * @param string|array - * @return array - */ - public function getFields($id = 'me', $fields) { - //Argument test - Eden_Facebook_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string or int - ->argument(2, 'string', 'array'); //Argument 2 must be a string or array - - //if fields is an array - if(is_array($fields)) { - //make it into a string - $fields = implode(',', $fields); - } - - //call it - return $this->getObject($id, NULL, array('fields' => $fields)); - } - - /** - * Returns the logout URL - * - * @param string - * @return string - */ - public function getLogoutUrl($redirect) { - Eden_Facebook_Error::i()->argument(1, 'url'); - return sprintf(self::LOGOUT_URL, urlencode($redirect), $this->_token); - } - - /** - * Returns the detail of any object - * - * @param string|int - * @param string|null - * @param array - * @param bool - * @return array - */ - public function getObject($id = 'me', $connection = NULL, array $query = array(), $auth = true) { - //Argument test - Eden_Facebook_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string or int - ->argument(2, 'string', 'null') //Argument 2 must be a string or null - ->argument(3, 'array') //Argument 3 must be an array - ->argument(4, 'bool'); //Argument 4 must be a boolean - - //if we have a connection - if($connection) { - //prepend a slash - $connection = '/'.$connection; - } - - //for the url - $url = self::GRAPH_URL.$id.$connection; - - //if this requires authentication - if($auth) { - //add the token - $query['access_token'] = $this->_token; - } - - //if we have a query - if(!empty($query)) { - //append it to the url - $url .= '?'.http_build_query($query); - } - - //call it - $object = $this->_call($url); - $object = json_decode($object, true); - - //if there is an error - if (isset($object['error'])) { - //throw it - Eden_Facebook_Error::i() - ->setMessage(Eden_Facebook_Error::GRAPH_FAILED) - ->addVariable($url) - ->addVariable($object['error']['type']) - ->addVariable($object['error']['message']) - ->trigger(); - } - - return $object; - } - - /** - * Returns user permissions - * - * @param string|int - * @return array - */ - public function getPermissions($id = 'me') { - Eden_Facebook_Error::i()->argument(1, 'string', 'int'); - $permissions = $this->getObject($id, 'permissions'); - return $permissions['data']; - } - - /** - * Returns the user's image - * - * @param string|int - * @param bool - * @return string - */ - public function getPictureUrl($id = 'me', $token = true) { - //Argument test - Eden_Facebook_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string or int - ->argument(2, 'bool'); //Argument 2 must be a boolean - - //for the URL - $url = self::GRAPH_URL.$id.'/picture'; - - //if this needs a token - if($token) { - //add it - $url .= '?access_token='.$this->_token; - } - - return $url; - } - - /** - * Returns the user info - * - * @return array - */ - public function getUser() { - return $this->getObject('me'); - } - - /** - * Like an object - * - * @param int|string object ID - * @return array - */ - public function like($id) { - Eden_Facebook_Error::i()->argument(1, 'string', 'int'); - $url = self::GRAPH_URL.$id.'/likes'; - $query = array('access_token' => $this->_token); - $url .= '?'.http_build_query($query); - - $this->_call($url); - return $this; - } - - /** - * Add a link - * - * @param string - * @return Eden_Facebook_Link - */ - public function link($url) { - return Eden_Facebook_Link::i($this->_token, $url); - } - - /** - * Maybe an event - * - * @param int event ID - * @return this - */ - public function maybeEvent($id) { - Eden_Facebook_Error::i()->argument(1, 'int'); - - $url = self::GRAPH_URL.$id.'/maybe'; - $query = array('access_token' => $this->_token); - $url .= '?'.http_build_query($query); - - json_decode($this->_call($url), true); - - return $this; - } - - /** - * Returns Facebook Post - * - * @param string - * @return Eden_Facebook_Post - */ - public function post($message) { - return Eden_Facebook_Post::i($this->_token, $message); - } - - /** - * Uploads a file of your album - * - * @param int|string - * @param string - * @param string|null - * @return int photo ID - */ - public function uploadPhoto($albumId, $file, $message = NULL) { - //Argument test - Eden_Facebook_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string or integer - ->argument(2, 'file') //Argument 2 must be a file - ->argument(3, 'string', 'null'); //Argument 3 must be a string or null - - //form the URL - $url = self::GRAPH_URL.$albumId.'/photos'; - $post = array('source' => '@'.$file); - $query = array('access_token' => $this->_token); - - //if there is a message - if($message) { - $post['message'] = $message; - } - - $url .= '?'.http_build_query($query); - - //send it off - $results = Eden_Curl::i() - ->setUrl($url) - ->setConnectTimeout(10) - ->setFollowLocation(true) - ->setTimeout(60) - ->verifyPeer(false) - ->setUserAgent(Eden_Facebook_Auth::USER_AGENT) - ->setHeaders('Expect') - ->when(!empty($post), 2) - ->setPost(true) - ->setPostFields($post) - ->getJsonResponse(); - - return $results['id']; - } - - /** - * Subscribes to Facebook real-time updates - * - * @param $app_id string Facebook app_id (We need to get this from a different place somehow, doesn't seem right making it a variable) - * @param $object string type of Facebook object (user, permissions, page) - * @param $fields string comma-deliminated list of fields to subscribe to (e.g. "name,picture,friends,feed") - * @param $callback_url - callback-url for the real-time updates - */ - public function subscribe($app_id, $object, $fields, $callback_url) - { - Eden_Facebook_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string'); - - $url = self::GRAPH_URL . "{$app_id}/subscriptions"; - $query = array('access_token' => $this->_token); - $url .= '?'.http_build_query($query); - - $verify_token = sha1($app_id.$object.$callback_url); - $post = array( - 'object' => $object, - 'fields' => $fields, - 'callback_url' => $callback_url, - 'verify_token' => $verify_token - ); - - //send it off - $results = Eden_Curl::i() - ->setUrl($url) - ->setConnectTimeout(10) - ->setFollowLocation(true) - ->setTimeout(60) - ->verifyPeer(false) - ->setUserAgent(Eden_Facebook_Auth::USER_AGENT) - ->setHeaders('Expect') - ->setPost(true) - ->setPostFields($post) - ->getJsonResponse(); - - return $verify_token; - } - - /* Protected Methods - -------------------------------*/ - protected function _call($url, array $post = array()) { - return Eden_Curl::i() - ->setUrl($url) - ->setConnectTimeout(10) - ->setFollowLocation(true) - ->setTimeout(60) - ->verifyPeer(false) - ->setUserAgent(Eden_Facebook_Auth::USER_AGENT) - ->setHeaders('Expect') - ->when(!empty($post), 2) - ->setPost(true) - ->setPostFields(http_build_query($post)) - ->getResponse(); - - } - - protected function _getList($id, $connection, $start = 0, $range = 0, $since = 0, $until = 0, $dateFormat = NULL) { - $query = array(); - if($start > 0) { - $query['offset'] = $start; - } - - if($range > 0) { - $query['limit'] = $range; - } - - if(is_string($since)) { - $since = strtotime($since); - } - - if(is_string($until)) { - $until = strtotime($until); - } - - if($since !== 0) { - $query['since'] = $since; - } - - if($until !== 0) { - $query['until'] = $until; - } - - $list = $this->getObject($id, $connection, $query); - - return $list['data']; - } - - protected function _search($connection, $query, $fields = NULL) { - $query = array('type' => $connection, 'q' => $query); - - if(is_array($fields)) { - $fields = implode(',', $fields); - } - - if($fields) { - $query['fields'] = $fields; - } - - $results = $this->getObject('search', NULL, $query); - - return $results['data']; - } - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package.st. + */ + +/** + * Facebook Authentication + * + * @package Eden + * @category facebook + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Facebook_Graph extends Eden_Class { + /* Constants + -------------------------------*/ + const GRAPH_URL = 'https://graph.facebook.com/'; + const LOGOUT_URL = 'https://www.facebook.com/logout.php?next=%s&access_token=%s'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_token = NULL; + + protected $_list = array( + 'Friends', 'Home', + 'Feed', 'Likes', + 'Movies', 'Music', + 'Books', 'Photos', + 'Albums', 'Videos', + 'VideoUploads', 'Events', + 'Groups', 'Checkins'); + + protected $_search = array( + 'Posts', 'Users', + 'Pages', 'Likes', + 'Places', 'Events', + 'Groups', 'Checkins'); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __call($name, $args) { + //if the method starts with get + if(strpos($name, 'get') === 0 && in_array(substr($name, 3), $this->_list)) { + $key = preg_replace("/([A-Z])/", "/$1", $name); + //get rid of get + $key = strtolower(substr($key, 4)); + + $id = 'me'; + if(!empty($args)) { + $id = array_shift($args); + } + + array_unshift($args, $id, $key); + + return call_user_func_array(array($this, '_getList'), $args); + } else if(strpos($name, 'search') === 0 && in_array(substr($name, 6), $this->_search)) { + + //get rid of get + $key = strtolower(substr($name, 6)); + + array_unshift($args, $key); + + return call_user_func_array(array($this, '_search'), $args); + } + } + + public function __construct($token) { + $this->_token = $token; + } + /* Public Methods + -------------------------------*/ + + /** + * Add an album + * + * @param string|int the object ID to place the album + * @param string + * @param string the album description + * @return int the album ID + */ + public function addAlbum($id, $name, $message) { + //Argument test + Eden_Facebook_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string or integer + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string'); //Argument 3 must be a string + + //form the URL + $url = self::GRAPH_URL.$id.'/albums'; + $post = array('name'=>$name,'message'=>$message); + $query = array('access_token' => $this->_token); + $url .= '?'.http_build_query($query); + $results = json_decode($this->_call($url, $post), true); + + return $results['id']; + } + + /** + * Adds a comment to a post + * + * @param int the post ID commenting on + * @param string + * @return int the comment ID + */ + public function addComment($id, $message) { + //Argument test + Eden_Facebook_Error::i() + ->argument(1, 'int') //Argument 1 must be an integer + ->argument(2, 'string'); //Argument 2 must be a string + + //form the URL + $url = self::GRAPH_URL.$id.'/comments'; + $post = array('message' => $message); + $query = array('access_token' => $this->_token); + $url .= '?'.http_build_query($query); + $results = json_decode($this->_call($url, $post), true); + + return $results['id']; + } + + /** + * Attend an event + * + * @param int the event ID + * @return this + */ + public function attendEvent($id) { + Eden_Facebook_Error::i()->argument(1, 'int'); + + $url = self::GRAPH_URL.$id.'/attending'; + $query = array('access_token' => $this->_token); + $url .= '?'.http_build_query($query); + + json_decode($this->_call($url), true); + + return $this; + } + + /** + * Check into a place + * + * @param string|int the checkin ID + * @param string + * @param float + * @param float + * @param int the place ID + * @param string|array + * @return int + */ + public function checkin($id, $message, $latitude, $longitude, $place, $tags) { + //Argument test + Eden_Facebook_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string or integer + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'float') //Argument 3 must be a string + ->argument(4, 'float') //Argument 4 must be a string + ->argument(5, 'int') //Argument 5 must be a string + ->argument(6, 'string', 'array'); //Argument 6 must be a string + + $url = self::GRAPH_URL.$id.'/checkins'; + $post = array('message' => $message); + $query = array('access_token' => $this->_token); + $url .= '?'.http_build_query($query); + + //if message + if($message) { + //add it + $post['message'] = $message; + } + + //if coords + if($latitude && $longitute) { + //add it + $post['coordinates'] = json_encode(array( + 'latitude' => $latitude, + 'longitude' => $longitude)); + } + + //if place + if($place) { + //add it + $post['place'] = $place; + } + + //if tags + if($tags) { + //add it + $post['tags'] = $tags; + } + + $results = json_decode($this->_call($url, $post), true); + return $results['id']; + } + + /** + * Add a note + * + * @param int|string object ID where to put the note + * @param string + * @param string + * @return int + */ + public function createNote($id = 'me', $subject, $message) { + //Argument test + Eden_Facebook_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string or integer + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string'); //Argument 3 must be a string + + //form the URL + $url = self::GRAPH_URL.$id.'/notes'; + $post = array('subject' => $subject, 'message' => $message); + $query = array('access_token' => $this->_token); + $url .= '?'.http_build_query($query); + $results = json_decode($this->_call($url, $post), true); + + return $results['id']; + } + + /** + * Decline an event + * + * @param int event ID + * @return this + */ + public function declineEvent($id) { + Eden_Facebook_Error::i()->argument(1, 'int'); + $url = self::GRAPH_URL.$id.'/declined'; + $query = array('access_token' => $this->_token); + $url .= '?'.http_build_query($query); + + json_decode($this->_call($url), true); + + return $this; + } + + /** + * Add an event + * + * @param string name of event + * @param string|int string date or time format + * @param string|int string date or time format + * @return Eden_Facebook_Event + */ + public function event($name, $start, $end) { + return Eden_Facebook_Event::i($this->_token, $name, $start, $end); + } + /** + * Returns specific fields of an object + * + * @param string|int + * @param string|array + * @return array + */ + public function getFields($id = 'me', $fields) { + //Argument test + Eden_Facebook_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string or int + ->argument(2, 'string', 'array'); //Argument 2 must be a string or array + + //if fields is an array + if(is_array($fields)) { + //make it into a string + $fields = implode(',', $fields); + } + + //call it + return $this->getObject($id, NULL, array('fields' => $fields)); + } + + /** + * Returns the logout URL + * + * @param string + * @return string + */ + public function getLogoutUrl($redirect) { + Eden_Facebook_Error::i()->argument(1, 'url'); + return sprintf(self::LOGOUT_URL, urlencode($redirect), $this->_token); + } + + /** + * Returns the detail of any object + * + * @param string|int + * @param string|null + * @param array + * @param bool + * @return array + */ + public function getObject($id = 'me', $connection = NULL, array $query = array(), $auth = true) { + //Argument test + Eden_Facebook_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string or int + ->argument(2, 'string', 'null') //Argument 2 must be a string or null + ->argument(3, 'array') //Argument 3 must be an array + ->argument(4, 'bool'); //Argument 4 must be a boolean + + //if we have a connection + if($connection) { + //prepend a slash + $connection = '/'.$connection; + } + + //for the url + $url = self::GRAPH_URL.$id.$connection; + + //if this requires authentication + if($auth) { + //add the token + $query['access_token'] = $this->_token; + } + + //if we have a query + if(!empty($query)) { + //append it to the url + $url .= '?'.http_build_query($query); + } + + //call it + $object = $this->_call($url); + $object = json_decode($object, true); + + //if there is an error + if (isset($object['error'])) { + //throw it + Eden_Facebook_Error::i() + ->setMessage(Eden_Facebook_Error::GRAPH_FAILED) + ->addVariable($url) + ->addVariable($object['error']['type']) + ->addVariable($object['error']['message']) + ->trigger(); + } + + return $object; + } + + /** + * Returns user permissions + * + * @param string|int + * @return array + */ + public function getPermissions($id = 'me') { + Eden_Facebook_Error::i()->argument(1, 'string', 'int'); + $permissions = $this->getObject($id, 'permissions'); + return $permissions['data']; + } + + /** + * Returns the user's image + * + * @param string|int + * @param bool + * @return string + */ + public function getPictureUrl($id = 'me', $token = true) { + //Argument test + Eden_Facebook_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string or int + ->argument(2, 'bool'); //Argument 2 must be a boolean + + //for the URL + $url = self::GRAPH_URL.$id.'/picture'; + + //if this needs a token + if($token) { + //add it + $url .= '?access_token='.$this->_token; + } + + return $url; + } + + /** + * Returns the user info + * + * @return array + */ + public function getUser() { + return $this->getObject('me'); + } + + /** + * Like an object + * + * @param int|string object ID + * @return array + */ + public function like($id) { + Eden_Facebook_Error::i()->argument(1, 'string', 'int'); + $url = self::GRAPH_URL.$id.'/likes'; + $query = array('access_token' => $this->_token); + $url .= '?'.http_build_query($query); + + $this->_call($url); + return $this; + } + + /** + * Add a link + * + * @param string + * @return Eden_Facebook_Link + */ + public function link($url) { + return Eden_Facebook_Link::i($this->_token, $url); + } + + /** + * Maybe an event + * + * @param int event ID + * @return this + */ + public function maybeEvent($id) { + Eden_Facebook_Error::i()->argument(1, 'int'); + + $url = self::GRAPH_URL.$id.'/maybe'; + $query = array('access_token' => $this->_token); + $url .= '?'.http_build_query($query); + + json_decode($this->_call($url), true); + + return $this; + } + + /** + * Returns Facebook Post + * + * @param string + * @return Eden_Facebook_Post + */ + public function post($message) { + return Eden_Facebook_Post::i($this->_token, $message); + } + + /** + * Uploads a file of your album + * + * @param int|string + * @param string + * @param string|null + * @return int photo ID + */ + public function uploadPhoto($albumId, $file, $message = NULL) { + //Argument test + Eden_Facebook_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string or integer + ->argument(2, 'file') //Argument 2 must be a file + ->argument(3, 'string', 'null'); //Argument 3 must be a string or null + + //form the URL + $url = self::GRAPH_URL.$albumId.'/photos'; + $post = array('source' => '@'.$file); + $query = array('access_token' => $this->_token); + + //if there is a message + if($message) { + $post['message'] = $message; + } + + $url .= '?'.http_build_query($query); + + //send it off + $results = Eden_Curl::i() + ->setUrl($url) + ->setConnectTimeout(10) + ->setFollowLocation(true) + ->setTimeout(60) + ->verifyPeer(false) + ->setUserAgent(Eden_Facebook_Auth::USER_AGENT) + ->setHeaders('Expect') + ->when(!empty($post), 2) + ->setPost(true) + ->setPostFields($post) + ->getJsonResponse(); + + return $results['id']; + } + + /** + * Subscribes to Facebook real-time updates + * + * @param $app_id string Facebook app_id (We need to get this from a different place somehow, doesn't seem right making it a variable) + * @param $object string type of Facebook object (user, permissions, page) + * @param $fields string comma-deliminated list of fields to subscribe to (e.g. "name,picture,friends,feed") + * @param $callback_url - callback-url for the real-time updates + */ + public function subscribe($app_id, $object, $fields, $callback_url) + { + Eden_Facebook_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string'); + + $url = self::GRAPH_URL . "{$app_id}/subscriptions"; + $query = array('access_token' => $this->_token); + $url .= '?'.http_build_query($query); + + $verify_token = sha1($app_id.$object.$callback_url); + $post = array( + 'object' => $object, + 'fields' => $fields, + 'callback_url' => $callback_url, + 'verify_token' => $verify_token + ); + + //send it off + $results = Eden_Curl::i() + ->setUrl($url) + ->setConnectTimeout(10) + ->setFollowLocation(true) + ->setTimeout(60) + ->verifyPeer(false) + ->setUserAgent(Eden_Facebook_Auth::USER_AGENT) + ->setHeaders('Expect') + ->setPost(true) + ->setPostFields($post) + ->getJsonResponse(); + + return $verify_token; + } + + /* Protected Methods + -------------------------------*/ + protected function _call($url, array $post = array()) { + return Eden_Curl::i() + ->setUrl($url) + ->setConnectTimeout(10) + ->setFollowLocation(true) + ->setTimeout(60) + ->verifyPeer(false) + ->setUserAgent(Eden_Facebook_Auth::USER_AGENT) + ->setHeaders('Expect') + ->when(!empty($post), 2) + ->setPost(true) + ->setPostFields(http_build_query($post)) + ->getResponse(); + + } + + protected function _getList($id, $connection, $start = 0, $range = 0, $since = 0, $until = 0, $dateFormat = NULL) { + $query = array(); + if($start > 0) { + $query['offset'] = $start; + } + + if($range > 0) { + $query['limit'] = $range; + } + + if(is_string($since)) { + $since = strtotime($since); + } + + if(is_string($until)) { + $until = strtotime($until); + } + + if($since !== 0) { + $query['since'] = $since; + } + + if($until !== 0) { + $query['until'] = $until; + } + + $list = $this->getObject($id, $connection, $query); + + return $list['data']; + } + + protected function _search($connection, $query, $fields = NULL) { + $query = array('type' => $connection, 'q' => $query); + + if(is_array($fields)) { + $fields = implode(',', $fields); + } + + if($fields) { + $query['fields'] = $fields; + } + + $results = $this->getObject('search', NULL, $query); + + return $results['data']; + } + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/foursquare.php b/library/eden/foursquare.php index 686d01f..a7fa155 100644 --- a/library/eden/foursquare.php +++ b/library/eden/foursquare.php @@ -1,262 +1,262 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ -require_once dirname(__FILE__).'/oauth2.php'; -require_once dirname(__FILE__).'/foursquare/error.php'; -require_once dirname(__FILE__).'/foursquare/base.php'; -require_once dirname(__FILE__).'/foursquare/oauth.php'; -require_once dirname(__FILE__).'/foursquare/campaign.php'; -require_once dirname(__FILE__).'/foursquare/checkins.php'; -require_once dirname(__FILE__).'/foursquare/events.php'; -require_once dirname(__FILE__).'/foursquare/list.php'; -require_once dirname(__FILE__).'/foursquare/pages.php'; -require_once dirname(__FILE__).'/foursquare/pageupdates.php'; -require_once dirname(__FILE__).'/foursquare/photos.php'; -require_once dirname(__FILE__).'/foursquare/settings.php'; -require_once dirname(__FILE__).'/foursquare/specials.php'; -require_once dirname(__FILE__).'/foursquare/tips.php'; -require_once dirname(__FILE__).'/foursquare/updates.php'; -require_once dirname(__FILE__).'/foursquare/users.php'; -require_once dirname(__FILE__).'/foursquare/venue.php'; -require_once dirname(__FILE__).'/foursquare/venuegroups.php'; - -/** - * foursquare API factory. This is a factory class with - * methods that will load up different google classes. - * Foursquare classes are organized as described on their - * developer site: campaign, checkins, events, list, pages - * pageupdates, photos, settings, tips, updates, users, venue - * and venuegroups. - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Foursquare extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /** - * Returns foursquare oauth - * - * @param *string - * @param *string - * @param *string - * @return Eden_Foursquare_Oauth - */ - public function auth($clientId, $clientSecret,$redirect) { - //argument test - Eden_Foursquare_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string'); //Argument 3 must be a string - - return Eden_Foursquare_Oauth::i($clientId, $clientSecret, $redirect); - } - - /** - * Returns foursquare campaign - * - * @param *string - * @return Eden_Foursquare_Campaign - */ - public function campaign($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Campaign::i($token); - } - - /** - * Returns foursquare campaign - * - * @param *string - * @return Eden_Foursquare_Checkins - */ - public function checkins($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Checkins::i($token); - } - - /** - * Returns foursquare events - * - * @param *string - * @return Eden_Foursquare_Events - */ - public function events($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Events::i($token); - } - - /** - * Returns foursquare lists - * - * @param *string - * @return Eden_Foursquare_List - */ - public function lists($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_List::i($token); - } - - /** - * Returns foursquare pages - * - * @param *string - * @return Eden_Foursquare_Pages - */ - public function pages($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Pages::i($token); - } - - /** - * Returns foursquare pageUpdates - * - * @param *string - * @return Eden_Foursquare_Pageupdates - */ - public function pageUpdates($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Pageupdates::i($token); - } - - /** - * Returns foursquare photos - * - * @param *string - * @return Eden_Foursquare_Photos - */ - public function photos($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Photos::i($token); - } - - /** - * Returns foursquare settings - * - * @param *string - * @return Eden_Foursquare_Settings - */ - public function settings($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Settings::i($token); - } - - /** - * Returns foursquare specials - * - * @param *string - * @return Eden_Foursquare_Specials - */ - public function specials($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Specials::i($token); - } - - /** - * Returns foursquare tips - * - * @param *string - * @return Eden_Foursquare_Tips - */ - public function tips($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Tips::i($token); - } - - /** - * Returns foursquare updates - * - * @param *string - * @return Eden_Foursquare_Updates - */ - public function updates($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Updates::i($token); - } - - /** - * Returns foursquare users - * - * @param *string - * @return Eden_Foursquare_Users - */ - public function users($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Users::i($token); - } - - /** - * Returns foursquare venue - * - * @param *string - * @return Eden_Foursquare_Venue - */ - public function venue($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Venue::i($token); - } - - /** - * Returns foursquare venueGroups - * - * @param *string - * @return Eden_Foursquare_Venuegroups - */ - public function venueGroups($token) { - //Argument 1 must be a string - Eden_Foursquare_Error::i()->argument(1, 'string'); - - return Eden_Foursquare_Venuegroups::i($token); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ +require_once dirname(__FILE__).'/oauth2.php'; +require_once dirname(__FILE__).'/foursquare/error.php'; +require_once dirname(__FILE__).'/foursquare/base.php'; +require_once dirname(__FILE__).'/foursquare/oauth.php'; +require_once dirname(__FILE__).'/foursquare/campaign.php'; +require_once dirname(__FILE__).'/foursquare/checkins.php'; +require_once dirname(__FILE__).'/foursquare/events.php'; +require_once dirname(__FILE__).'/foursquare/list.php'; +require_once dirname(__FILE__).'/foursquare/pages.php'; +require_once dirname(__FILE__).'/foursquare/pageupdates.php'; +require_once dirname(__FILE__).'/foursquare/photos.php'; +require_once dirname(__FILE__).'/foursquare/settings.php'; +require_once dirname(__FILE__).'/foursquare/specials.php'; +require_once dirname(__FILE__).'/foursquare/tips.php'; +require_once dirname(__FILE__).'/foursquare/updates.php'; +require_once dirname(__FILE__).'/foursquare/users.php'; +require_once dirname(__FILE__).'/foursquare/venue.php'; +require_once dirname(__FILE__).'/foursquare/venuegroups.php'; + +/** + * foursquare API factory. This is a factory class with + * methods that will load up different google classes. + * Foursquare classes are organized as described on their + * developer site: campaign, checkins, events, list, pages + * pageupdates, photos, settings, tips, updates, users, venue + * and venuegroups. + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Foursquare extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /** + * Returns foursquare oauth + * + * @param *string + * @param *string + * @param *string + * @return Eden_Foursquare_Oauth + */ + public function auth($clientId, $clientSecret,$redirect) { + //argument test + Eden_Foursquare_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string'); //Argument 3 must be a string + + return Eden_Foursquare_Oauth::i($clientId, $clientSecret, $redirect); + } + + /** + * Returns foursquare campaign + * + * @param *string + * @return Eden_Foursquare_Campaign + */ + public function campaign($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Campaign::i($token); + } + + /** + * Returns foursquare campaign + * + * @param *string + * @return Eden_Foursquare_Checkins + */ + public function checkins($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Checkins::i($token); + } + + /** + * Returns foursquare events + * + * @param *string + * @return Eden_Foursquare_Events + */ + public function events($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Events::i($token); + } + + /** + * Returns foursquare lists + * + * @param *string + * @return Eden_Foursquare_List + */ + public function lists($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_List::i($token); + } + + /** + * Returns foursquare pages + * + * @param *string + * @return Eden_Foursquare_Pages + */ + public function pages($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Pages::i($token); + } + + /** + * Returns foursquare pageUpdates + * + * @param *string + * @return Eden_Foursquare_Pageupdates + */ + public function pageUpdates($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Pageupdates::i($token); + } + + /** + * Returns foursquare photos + * + * @param *string + * @return Eden_Foursquare_Photos + */ + public function photos($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Photos::i($token); + } + + /** + * Returns foursquare settings + * + * @param *string + * @return Eden_Foursquare_Settings + */ + public function settings($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Settings::i($token); + } + + /** + * Returns foursquare specials + * + * @param *string + * @return Eden_Foursquare_Specials + */ + public function specials($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Specials::i($token); + } + + /** + * Returns foursquare tips + * + * @param *string + * @return Eden_Foursquare_Tips + */ + public function tips($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Tips::i($token); + } + + /** + * Returns foursquare updates + * + * @param *string + * @return Eden_Foursquare_Updates + */ + public function updates($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Updates::i($token); + } + + /** + * Returns foursquare users + * + * @param *string + * @return Eden_Foursquare_Users + */ + public function users($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Users::i($token); + } + + /** + * Returns foursquare venue + * + * @param *string + * @return Eden_Foursquare_Venue + */ + public function venue($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Venue::i($token); + } + + /** + * Returns foursquare venueGroups + * + * @param *string + * @return Eden_Foursquare_Venuegroups + */ + public function venueGroups($token) { + //Argument 1 must be a string + Eden_Foursquare_Error::i()->argument(1, 'string'); + + return Eden_Foursquare_Venuegroups::i($token); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/foursquare/oauth.php b/library/eden/foursquare/oauth.php index 834ef93..5205388 100644 --- a/library/eden/foursquare/oauth.php +++ b/library/eden/foursquare/oauth.php @@ -1,51 +1,51 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google oauth - * - * @package Eden - * @category google - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Foursquare_Oauth extends Eden_Oauth2_Client { - /* Constants - -------------------------------*/ - const REQUEST_URL = 'https://foursquare.com/oauth2/authorize'; - const ACCESS_URL = 'https://foursquare.com/oauth2/access_token'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($clientId, $clientSecret, $redirect) { - //argument test - Eden_Foursquare_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string'); //Argument 4 must be a string - - parent::__construct($clientId, $clientSecret, $redirect, self::REQUEST_URL, self::ACCESS_URL); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google oauth + * + * @package Eden + * @category google + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Foursquare_Oauth extends Eden_Oauth2_Client { + /* Constants + -------------------------------*/ + const REQUEST_URL = 'https://foursquare.com/oauth2/authorize'; + const ACCESS_URL = 'https://foursquare.com/oauth2/access_token'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($clientId, $clientSecret, $redirect) { + //argument test + Eden_Foursquare_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string'); //Argument 4 must be a string + + parent::__construct($clientId, $clientSecret, $redirect, self::REQUEST_URL, self::ACCESS_URL); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/getsatisfaction.php b/library/eden/getsatisfaction.php index 161bacc..954b02a 100644 --- a/library/eden/getsatisfaction.php +++ b/library/eden/getsatisfaction.php @@ -1,285 +1,285 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/oauth.php'; -require_once dirname(__FILE__).'/getsatisfaction/error.php'; -require_once dirname(__FILE__).'/getsatisfaction/base.php'; -require_once dirname(__FILE__).'/getsatisfaction/company.php'; -require_once dirname(__FILE__).'/getsatisfaction/detail.php'; -require_once dirname(__FILE__).'/getsatisfaction/oauth.php'; -require_once dirname(__FILE__).'/getsatisfaction/people.php'; -require_once dirname(__FILE__).'/getsatisfaction/product.php'; -require_once dirname(__FILE__).'/getsatisfaction/reply.php'; -require_once dirname(__FILE__).'/getsatisfaction/replies.php'; -require_once dirname(__FILE__).'/getsatisfaction/tag.php'; -require_once dirname(__FILE__).'/getsatisfaction/topic.php'; - -/** - * Get Satisfaction API factory. This is a factory class with - * methods that will load up different Get Satisfaction classes. - * Get Satisfaction classes are organized as described on their - * developer site: company, detail, oauth, people, post, product, - * replies, tag, topics. - * - * @package Eden - * @category getsatisfaction - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Getsatisfaction extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns Getsatisfaction Company - * - * @param string - * @param string - * @param string - * @param string - * @return Eden_Getsatisfaction_Company - */ - public function company($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string'); - - return Eden_Getsatisfaction_Company::i( - $consumerKey, - $consumerSecret, - $accessToken, - $accessSecret); - } - - /** - * Returns Getsatisfaction Detail - * - * @param string - * @param string - * @param string - * @param string - * @return Eden_Getsatisfaction_Detail - */ - public function detail($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string'); - - return Eden_Getsatisfaction_Detail::i( - $consumerKey, - $consumerSecret, - $accessToken, - $accessSecret); - } - - /** - * Returns Getsatisfaction OAuth - * - * @param string - * @param string - * @param string - * @param string - * @return Eden_Getsatisfaction_Oauth - */ - public function auth($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string'); - - return Eden_Getsatisfaction_Oauth::i( - $consumerKey, - $consumerSecret, - $accessToken, - $accessSecret); - } - - /** - * Returns Getsatisfaction People - * - * @param string - * @param string - * @param string - * @param string - * @return Eden_Getsatisfaction_People - */ - public function people($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string'); - - return Eden_Getsatisfaction_People::i( - $consumerKey, - $consumerSecret, - $accessToken, - $accessSecret); - } - - /** - * Returns Getsatisfaction post - * - * @param string - * @param string - * @param string - * @param string - * @return Eden_Getsatisfaction_Post - */ - public function post($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string'); - - return Eden_Getsatisfaction_Post::i( - $consumerKey, - $consumerSecret, - $accessToken, - $accessSecret); - } - - /** - * Returns Getsatisfaction Product - * - * @param string - * @param string - * @param string - * @param string - * @return Eden_Getsatisfaction_Product - */ - public function product($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string'); - - return Eden_Getsatisfaction_Product::i( - $consumerKey, - $consumerSecret, - $accessToken, - $accessSecret); - } - - /** - * Returns Getsatisfaction Replies - * - * @param string - * @param string - * @param string - * @param string - * @return Eden_Getsatisfaction_Replies - */ - public function replies($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string'); - - return Eden_Getsatisfaction_Replies::i( - $consumerKey, - $consumerSecret, - $accessToken, - $accessSecret); - } - - /** - * Returns Getsatisfaction reply - * - * @param string - * @param string - * @param string - * @param string - * @return Eden_Getsatisfaction_Reply - */ - public function reply($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string'); - - return Eden_Getsatisfaction_Reply::i( - $consumerKey, - $consumerSecret, - $accessToken, - $accessSecret); - } - - /** - * Returns Getsatisfaction Tags - * - * @param string - * @param string - * @param string - * @param string - * @return Eden_Getsatisfaction_Tag - */ - public function tag($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string'); - - return Eden_Getsatisfaction_Tag::i( - $consumerKey, - $consumerSecret, - $accessToken, - $accessSecret); - } - - /** - * Returns Getsatisfaction Topics - * - * @param string - * @param string - * @param string - * @param string - * @return Eden_Getsatisfaction_Topic - */ - public function topic($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string'); - - return Eden_Getsatisfaction_Topic::i( - $consumerKey, - $consumerSecret, - $accessToken, - $accessSecret); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ -} + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/oauth.php'; +require_once dirname(__FILE__).'/getsatisfaction/error.php'; +require_once dirname(__FILE__).'/getsatisfaction/base.php'; +require_once dirname(__FILE__).'/getsatisfaction/company.php'; +require_once dirname(__FILE__).'/getsatisfaction/detail.php'; +require_once dirname(__FILE__).'/getsatisfaction/oauth.php'; +require_once dirname(__FILE__).'/getsatisfaction/people.php'; +require_once dirname(__FILE__).'/getsatisfaction/product.php'; +require_once dirname(__FILE__).'/getsatisfaction/reply.php'; +require_once dirname(__FILE__).'/getsatisfaction/replies.php'; +require_once dirname(__FILE__).'/getsatisfaction/tag.php'; +require_once dirname(__FILE__).'/getsatisfaction/topic.php'; + +/** + * Get Satisfaction API factory. This is a factory class with + * methods that will load up different Get Satisfaction classes. + * Get Satisfaction classes are organized as described on their + * developer site: company, detail, oauth, people, post, product, + * replies, tag, topics. + * + * @package Eden + * @category getsatisfaction + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Getsatisfaction extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns Getsatisfaction Company + * + * @param string + * @param string + * @param string + * @param string + * @return Eden_Getsatisfaction_Company + */ + public function company($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string'); + + return Eden_Getsatisfaction_Company::i( + $consumerKey, + $consumerSecret, + $accessToken, + $accessSecret); + } + + /** + * Returns Getsatisfaction Detail + * + * @param string + * @param string + * @param string + * @param string + * @return Eden_Getsatisfaction_Detail + */ + public function detail($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string'); + + return Eden_Getsatisfaction_Detail::i( + $consumerKey, + $consumerSecret, + $accessToken, + $accessSecret); + } + + /** + * Returns Getsatisfaction OAuth + * + * @param string + * @param string + * @param string + * @param string + * @return Eden_Getsatisfaction_Oauth + */ + public function auth($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string'); + + return Eden_Getsatisfaction_Oauth::i( + $consumerKey, + $consumerSecret, + $accessToken, + $accessSecret); + } + + /** + * Returns Getsatisfaction People + * + * @param string + * @param string + * @param string + * @param string + * @return Eden_Getsatisfaction_People + */ + public function people($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string'); + + return Eden_Getsatisfaction_People::i( + $consumerKey, + $consumerSecret, + $accessToken, + $accessSecret); + } + + /** + * Returns Getsatisfaction post + * + * @param string + * @param string + * @param string + * @param string + * @return Eden_Getsatisfaction_Post + */ + public function post($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string'); + + return Eden_Getsatisfaction_Post::i( + $consumerKey, + $consumerSecret, + $accessToken, + $accessSecret); + } + + /** + * Returns Getsatisfaction Product + * + * @param string + * @param string + * @param string + * @param string + * @return Eden_Getsatisfaction_Product + */ + public function product($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string'); + + return Eden_Getsatisfaction_Product::i( + $consumerKey, + $consumerSecret, + $accessToken, + $accessSecret); + } + + /** + * Returns Getsatisfaction Replies + * + * @param string + * @param string + * @param string + * @param string + * @return Eden_Getsatisfaction_Replies + */ + public function replies($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string'); + + return Eden_Getsatisfaction_Replies::i( + $consumerKey, + $consumerSecret, + $accessToken, + $accessSecret); + } + + /** + * Returns Getsatisfaction reply + * + * @param string + * @param string + * @param string + * @param string + * @return Eden_Getsatisfaction_Reply + */ + public function reply($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string'); + + return Eden_Getsatisfaction_Reply::i( + $consumerKey, + $consumerSecret, + $accessToken, + $accessSecret); + } + + /** + * Returns Getsatisfaction Tags + * + * @param string + * @param string + * @param string + * @param string + * @return Eden_Getsatisfaction_Tag + */ + public function tag($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string'); + + return Eden_Getsatisfaction_Tag::i( + $consumerKey, + $consumerSecret, + $accessToken, + $accessSecret); + } + + /** + * Returns Getsatisfaction Topics + * + * @param string + * @param string + * @param string + * @param string + * @return Eden_Getsatisfaction_Topic + */ + public function topic($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string'); + + return Eden_Getsatisfaction_Topic::i( + $consumerKey, + $consumerSecret, + $accessToken, + $accessSecret); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ +} diff --git a/library/eden/getsatisfaction/base.php b/library/eden/getsatisfaction/base.php index 5c8f02f..2e9ab30 100644 --- a/library/eden/getsatisfaction/base.php +++ b/library/eden/getsatisfaction/base.php @@ -1,102 +1,102 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Get Satisfaction base - * - * @package Eden - * @category getsatisfaction - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Getsatisfaction_Base extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_consumerKey = NULL; - protected $_consumerSecret = NULL; - protected $_accessToken = NULL; - protected $_accessSecret = NULL; - - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - /* Magic - -------------------------------*/ - public function __construct($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //argument test - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - $this->_consumerKey = $consumerKey; - $this->_consumerSecret = $consumerSecret; - $this->_accessToken = $accessToken; - $this->_accessSecret = $accessSecret; - } - - /* Public Methods - -------------------------------*/ - /** - * Returns the meta of the last call - * - * @return array - */ - public function getMeta($key = NULL) { - Eden_Google_Error::i()->argument(1, 'string', 'null'); - - if(isset($this->_meta[$key])) { - return $this->_meta[$key]; - } - - return $this->_meta; - } - - /* Protected Methods - -------------------------------*/ - protected function _getResponse($url, array $query = array()) { - $rest = Eden_Oauth::i() - ->consumer($url, $this->_consumerKey, $this->_consumerSecret) - ->setToken($this->_accessToken, $this->_accessSecret) - ->setSignatureToHmacSha1(); - - $response = $rest->getJsonResponse($query); - - $this->_meta = $rest->getMeta(); - - return $response; - } - - protected function _post($url, $query = array(), $jsonEncode = false) { - $rest = Eden_Oauth::i() - ->consumer($url, $this->_consumerKey, $this->_consumerSecret) - ->setToken($this->_accessToken, $this->_accessSecret) - ->setMethodToPost() - ->useAuthorization() - ->setSignatureToHmacSha1(); - - if($jsonEncode) { - $rest->jsonEncodeQuery(); - } - - $response = $rest->getJsonResponse($query); - - $this->_meta = $rest->getMeta(); - - return $response; - } - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Get Satisfaction base + * + * @package Eden + * @category getsatisfaction + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Getsatisfaction_Base extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_consumerKey = NULL; + protected $_consumerSecret = NULL; + protected $_accessToken = NULL; + protected $_accessSecret = NULL; + + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + /* Magic + -------------------------------*/ + public function __construct($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //argument test + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + $this->_consumerKey = $consumerKey; + $this->_consumerSecret = $consumerSecret; + $this->_accessToken = $accessToken; + $this->_accessSecret = $accessSecret; + } + + /* Public Methods + -------------------------------*/ + /** + * Returns the meta of the last call + * + * @return array + */ + public function getMeta($key = NULL) { + Eden_Google_Error::i()->argument(1, 'string', 'null'); + + if(isset($this->_meta[$key])) { + return $this->_meta[$key]; + } + + return $this->_meta; + } + + /* Protected Methods + -------------------------------*/ + protected function _getResponse($url, array $query = array()) { + $rest = Eden_Oauth::i() + ->consumer($url, $this->_consumerKey, $this->_consumerSecret) + ->setToken($this->_accessToken, $this->_accessSecret) + ->setSignatureToHmacSha1(); + + $response = $rest->getJsonResponse($query); + + $this->_meta = $rest->getMeta(); + + return $response; + } + + protected function _post($url, $query = array(), $jsonEncode = false) { + $rest = Eden_Oauth::i() + ->consumer($url, $this->_consumerKey, $this->_consumerSecret) + ->setToken($this->_accessToken, $this->_accessSecret) + ->setMethodToPost() + ->useAuthorization() + ->setSignatureToHmacSha1(); + + if($jsonEncode) { + $rest->jsonEncodeQuery(); + } + + $response = $rest->getJsonResponse($query); + + $this->_meta = $rest->getMeta(); + + return $response; + } + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/getsatisfaction/company.php b/library/eden/getsatisfaction/company.php index 0b99d5d..9a42e66 100644 --- a/library/eden/getsatisfaction/company.php +++ b/library/eden/getsatisfaction/company.php @@ -1,204 +1,204 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Various ways to get a list of companies in Get Satisfaction - * - * @package Eden - * @category getsatisfaction - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Getsatisfaction_Company extends Eden_Getsatisfaction_Base { - /* Constants - -------------------------------*/ - const URL_LIST = 'http://api.getsatisfaction.com/companies.json'; - const URL_PEOPLE = 'http://api.getsatisfaction.com/people/%s/companies.json'; - const URL_PRODUCT = 'http://api.getsatisfaction.com/products/%s/companies.json'; - const URL_ACTIVITY = 'http://api.getsatisfaction.com/companies/%s/last_activity_at.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_query = array(); - protected $_url = self::URL_LIST; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Set keyword filter - * - * @param string - * @return this - */ - public function filterByKeyword($keyword) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string'); - - $this->_query['query'] = $keyword; - - return $this; - } - - /** - * Returns a list of companies - * - * @return array - */ - public function getResponse() { - return $this->_getResponse($this->_url, $this->_query); - } - - /** - * Sets activity URL - * - * @param int|string - * @return this - */ - public function searchByActivity($company) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_ACTIVITY, $company); - return $this; - } - - /** - * Set product URL - * - * @param int|string - * @return this - */ - public function searchByProduct($product) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_PRODUCT, $product); - return $this; - } - - /** - * Sets user URL - * - * @param int|string - * @return this - */ - public function searchByUser($user) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_PEOPLE, $user); - return $this; - } - - /** - * Show private companies - * - * @return this - */ - public function showPrivate() { - $this->_query['show'] = 'private'; - return $this; - } - - /** - * Show public companies - * - * @return this - */ - public function showPublic() { - $this->_query['show'] = 'public'; - return $this; - } - - /** - * Show visible companies - * - * @return this - */ - public function showVisible() { - $this->_query['show'] = 'not_hidden'; - return $this; - } - - /** - * Set page - * - * @param int - * @return this - */ - public function setPage($page = 0) { - Eden_Getsatisfaction_Error::i()->argument(1, 'int'); - - if($page < 0) { - $page = 0; - } - - $this->_query['page'] = $page; - - return $this; - } - - /** - * Set range - * - * @param int - * @return this - */ - public function setRange($limit = 10) { - Eden_Getsatisfaction_Error::i()->argument(1, 'int'); - - if($limit < 0) { - $limit = 10; - } - - $this->_query['limit'] = $limit; - - return $this; - } - - /** - * Sort by active - * - * @return this - */ - public function sortByActive() { - $this->_query['sort'] = 'recently_active'; - return $this; - } - - /** - * Sort by letters - * - * @return this - */ - public function sortByAlphabet() { - $this->_query['sort'] = 'alpha'; - return $this; - } - - /** - * Sort by created - * - * @return this - */ - public function sortByCreated() { - $this->_query['sort'] = 'recently_created'; - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Various ways to get a list of companies in Get Satisfaction + * + * @package Eden + * @category getsatisfaction + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Getsatisfaction_Company extends Eden_Getsatisfaction_Base { + /* Constants + -------------------------------*/ + const URL_LIST = 'http://api.getsatisfaction.com/companies.json'; + const URL_PEOPLE = 'http://api.getsatisfaction.com/people/%s/companies.json'; + const URL_PRODUCT = 'http://api.getsatisfaction.com/products/%s/companies.json'; + const URL_ACTIVITY = 'http://api.getsatisfaction.com/companies/%s/last_activity_at.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_query = array(); + protected $_url = self::URL_LIST; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Set keyword filter + * + * @param string + * @return this + */ + public function filterByKeyword($keyword) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string'); + + $this->_query['query'] = $keyword; + + return $this; + } + + /** + * Returns a list of companies + * + * @return array + */ + public function getResponse() { + return $this->_getResponse($this->_url, $this->_query); + } + + /** + * Sets activity URL + * + * @param int|string + * @return this + */ + public function searchByActivity($company) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_ACTIVITY, $company); + return $this; + } + + /** + * Set product URL + * + * @param int|string + * @return this + */ + public function searchByProduct($product) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_PRODUCT, $product); + return $this; + } + + /** + * Sets user URL + * + * @param int|string + * @return this + */ + public function searchByUser($user) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_PEOPLE, $user); + return $this; + } + + /** + * Show private companies + * + * @return this + */ + public function showPrivate() { + $this->_query['show'] = 'private'; + return $this; + } + + /** + * Show public companies + * + * @return this + */ + public function showPublic() { + $this->_query['show'] = 'public'; + return $this; + } + + /** + * Show visible companies + * + * @return this + */ + public function showVisible() { + $this->_query['show'] = 'not_hidden'; + return $this; + } + + /** + * Set page + * + * @param int + * @return this + */ + public function setPage($page = 0) { + Eden_Getsatisfaction_Error::i()->argument(1, 'int'); + + if($page < 0) { + $page = 0; + } + + $this->_query['page'] = $page; + + return $this; + } + + /** + * Set range + * + * @param int + * @return this + */ + public function setRange($limit = 10) { + Eden_Getsatisfaction_Error::i()->argument(1, 'int'); + + if($limit < 0) { + $limit = 10; + } + + $this->_query['limit'] = $limit; + + return $this; + } + + /** + * Sort by active + * + * @return this + */ + public function sortByActive() { + $this->_query['sort'] = 'recently_active'; + return $this; + } + + /** + * Sort by letters + * + * @return this + */ + public function sortByAlphabet() { + $this->_query['sort'] = 'alpha'; + return $this; + } + + /** + * Sort by created + * + * @return this + */ + public function sortByCreated() { + $this->_query['sort'] = 'recently_created'; + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/getsatisfaction/detail.php b/library/eden/getsatisfaction/detail.php index 75b3775..6c03bad 100644 --- a/library/eden/getsatisfaction/detail.php +++ b/library/eden/getsatisfaction/detail.php @@ -1,52 +1,52 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Get Satisfaction Detail Methods - * - * @package Eden - * @category getsatisfaction - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_GetSatisfaction_Detail extends Eden_GetSatisfaction_Base { - /* Constants - -------------------------------*/ - const URL = 'http://api.getsatisfaction.com/topics/%s.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns topic details - * - * @param string|int - * @return array - */ - public function getTopic($topic) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - return $this->_getResponse(sprintf(self::URL, $topic)); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Get Satisfaction Detail Methods + * + * @package Eden + * @category getsatisfaction + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_GetSatisfaction_Detail extends Eden_GetSatisfaction_Base { + /* Constants + -------------------------------*/ + const URL = 'http://api.getsatisfaction.com/topics/%s.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns topic details + * + * @param string|int + * @return array + */ + public function getTopic($topic) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + return $this->_getResponse(sprintf(self::URL, $topic)); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/getsatisfaction/error.php b/library/eden/getsatisfaction/error.php index a7c83e8..58a9fb7 100644 --- a/library/eden/getsatisfaction/error.php +++ b/library/eden/getsatisfaction/error.php @@ -1,39 +1,39 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Get Satisfaction Errors - * - * @package Eden - * @category getsatisfaction - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Getsatisfaction_Error extends Eden_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Get Satisfaction Errors + * + * @package Eden + * @category getsatisfaction + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Getsatisfaction_Error extends Eden_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/getsatisfaction/oauth.php b/library/eden/getsatisfaction/oauth.php index 10a60d0..1f68037 100644 --- a/library/eden/getsatisfaction/oauth.php +++ b/library/eden/getsatisfaction/oauth.php @@ -1,123 +1,123 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Get Satisfaction OAuth - * - * @package Eden - * @category getsatisfaction - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Getsatisfaction_Oauth extends Eden_Class { - /* Constants - -------------------------------*/ - const REQUEST_URL = 'http://getsatisfaction.com/api/request_token'; - const AUTHORIZE_URL = 'http://getsatisfaction.com/api/authorize'; - const ACCESS_URL = 'http://getsatisfaction.com/api/access_token'; - const SECRET_KEY = 'getsatisfaction_token_secret'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_key = NULL; - protected $_secret = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($consumerKey, $consumerSecret) { - //argument test - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string'); //Argument 2 must be a string - - $this->_key = $consumerKey; - $this->_secret = $consumerSecret; - } - - /* Public Methods - -------------------------------*/ - /** - * Returns the access token - * - * @param string - * @param string - * @return string - */ - public function getAccess($token, $secret) { - //argument test - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string'); //Argument 2 must be a string - - return Eden_Oauth::i() - ->consumer(self::ACCESS_URL, $this->_key, $this->_secret) - ->useAuthorization() - ->setMethodToPost() - ->setToken($token, $secret) - ->setSignatureToHmacSha1() - ->getQueryResponse(); - } - - /** - * Returns the URL used for login. - * - * @param string - * @return string - */ - public function getLoginUrl($redirect) { - //Argument 1 must be a string - Eden_Getsatisfaction_Error::i()->argument(1, 'string'); - - //get the token - $token = Eden_Oauth::i() - ->consumer(self::REQUEST_URL, $this->_key, $this->_secret) - ->useAuthorization() - ->setMethodToPost() - ->setSignatureToHmacSha1() - ->getQueryResponse(); - - //to avoid any unesissary usage of persistent data, - //we are going to attach the secret to the login URL - $secret = self::SECRET_KEY.'='.$token['oauth_token_secret']; - - //determine the conector - $connector = NULL; - - //if there is no question mark - if(strpos($redirect, '?') === false) { - $connector = '?'; - //if the redirect doesn't end with a question mark - } else if(substr($redirect, -1) != '?') { - $connector = '&'; - } - - //now add the secret to the redirect - $redirect .= $connector.$secret; - - //build the query - $query = array( - 'oauth_token' => $token['oauth_token'], - 'oauth_callback' => $redirect); - - $query = http_build_query($query); - return self::AUTHORIZE_URL.'?'.$query; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Get Satisfaction OAuth + * + * @package Eden + * @category getsatisfaction + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Getsatisfaction_Oauth extends Eden_Class { + /* Constants + -------------------------------*/ + const REQUEST_URL = 'http://getsatisfaction.com/api/request_token'; + const AUTHORIZE_URL = 'http://getsatisfaction.com/api/authorize'; + const ACCESS_URL = 'http://getsatisfaction.com/api/access_token'; + const SECRET_KEY = 'getsatisfaction_token_secret'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_key = NULL; + protected $_secret = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($consumerKey, $consumerSecret) { + //argument test + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string'); //Argument 2 must be a string + + $this->_key = $consumerKey; + $this->_secret = $consumerSecret; + } + + /* Public Methods + -------------------------------*/ + /** + * Returns the access token + * + * @param string + * @param string + * @return string + */ + public function getAccess($token, $secret) { + //argument test + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string'); //Argument 2 must be a string + + return Eden_Oauth::i() + ->consumer(self::ACCESS_URL, $this->_key, $this->_secret) + ->useAuthorization() + ->setMethodToPost() + ->setToken($token, $secret) + ->setSignatureToHmacSha1() + ->getQueryResponse(); + } + + /** + * Returns the URL used for login. + * + * @param string + * @return string + */ + public function getLoginUrl($redirect) { + //Argument 1 must be a string + Eden_Getsatisfaction_Error::i()->argument(1, 'string'); + + //get the token + $token = Eden_Oauth::i() + ->consumer(self::REQUEST_URL, $this->_key, $this->_secret) + ->useAuthorization() + ->setMethodToPost() + ->setSignatureToHmacSha1() + ->getQueryResponse(); + + //to avoid any unesissary usage of persistent data, + //we are going to attach the secret to the login URL + $secret = self::SECRET_KEY.'='.$token['oauth_token_secret']; + + //determine the conector + $connector = NULL; + + //if there is no question mark + if(strpos($redirect, '?') === false) { + $connector = '?'; + //if the redirect doesn't end with a question mark + } else if(substr($redirect, -1) != '?') { + $connector = '&'; + } + + //now add the secret to the redirect + $redirect .= $connector.$secret; + + //build the query + $query = array( + 'oauth_token' => $token['oauth_token'], + 'oauth_callback' => $redirect); + + $query = http_build_query($query); + return self::AUTHORIZE_URL.'?'.$query; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/getsatisfaction/people.php b/library/eden/getsatisfaction/people.php index a016cf1..4e4124f 100644 --- a/library/eden/getsatisfaction/people.php +++ b/library/eden/getsatisfaction/people.php @@ -1,144 +1,144 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Various ways to get a list of people in Get Satisfaction - * - * @package Eden - * @category getsatisfaction - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_GetSatisfaction_People extends Eden_GetSatisfaction_Base { - /* Constants - -------------------------------*/ - const URL_LIST = 'http://api.getsatisfaction.com/people.json'; - const URL_EMPLOYEE = 'http://api.getsatisfaction.com/companies/%s/employees.json'; - const URL_COMPANY = 'http://api.getsatisfaction.com/companies/%s/people.json'; - const URL_TOPIC = 'http://api.getsatisfaction.com/topics/%s/people'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_query = array(); - protected $_url = self::URL_LIST; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Filter by keyword - * - * @param string - * @return this - */ - public function filterByKeyword($keyword) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string'); - - $this->_query['query'] = $keyword; - - return $this; - } - - /** - * Returns a list of companies - * - * @return array - */ - public function getResponse() { - return $this->_getResponse($this->_url, $this->_query); - } - - /** - * Sets company URL - * - * @param string|int - * @return this - */ - public function searchByCompany($company) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_COMPANY, $company); - return $this; - } - - /** - * Sets Employee URL - * - * @param string|int - * @return this - */ - public function searchByEmployee($company) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_EMPLOYEE, $company); - return $this; - } - - /** - * Sets topic URL - * - * @param string|int - * @return this - */ - public function searchByTopic($topic) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_TOPIC, $topic); - return $this; - } - - /** - * Set page - * - * @param int - * @return this - */ - public function setPage($page = 0) { - Eden_Getsatisfaction_Error::i()->argument(1, 'int'); - - if($page < 0) { - $page = 0; - } - - $this->_query['page'] = $page; - - return $this; - } - - /** - * Set range - * - * @param int - * @return this - */ - public function setRange($limit = 10) { - Eden_Getsatisfaction_Error::i()->argument(1, 'int'); - - if($limit < 0) { - $limit = 10; - } - - $this->_query['limit'] = $limit; - - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Various ways to get a list of people in Get Satisfaction + * + * @package Eden + * @category getsatisfaction + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_GetSatisfaction_People extends Eden_GetSatisfaction_Base { + /* Constants + -------------------------------*/ + const URL_LIST = 'http://api.getsatisfaction.com/people.json'; + const URL_EMPLOYEE = 'http://api.getsatisfaction.com/companies/%s/employees.json'; + const URL_COMPANY = 'http://api.getsatisfaction.com/companies/%s/people.json'; + const URL_TOPIC = 'http://api.getsatisfaction.com/topics/%s/people'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_query = array(); + protected $_url = self::URL_LIST; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Filter by keyword + * + * @param string + * @return this + */ + public function filterByKeyword($keyword) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string'); + + $this->_query['query'] = $keyword; + + return $this; + } + + /** + * Returns a list of companies + * + * @return array + */ + public function getResponse() { + return $this->_getResponse($this->_url, $this->_query); + } + + /** + * Sets company URL + * + * @param string|int + * @return this + */ + public function searchByCompany($company) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_COMPANY, $company); + return $this; + } + + /** + * Sets Employee URL + * + * @param string|int + * @return this + */ + public function searchByEmployee($company) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_EMPLOYEE, $company); + return $this; + } + + /** + * Sets topic URL + * + * @param string|int + * @return this + */ + public function searchByTopic($topic) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_TOPIC, $topic); + return $this; + } + + /** + * Set page + * + * @param int + * @return this + */ + public function setPage($page = 0) { + Eden_Getsatisfaction_Error::i()->argument(1, 'int'); + + if($page < 0) { + $page = 0; + } + + $this->_query['page'] = $page; + + return $this; + } + + /** + * Set range + * + * @param int + * @return this + */ + public function setRange($limit = 10) { + Eden_Getsatisfaction_Error::i()->argument(1, 'int'); + + if($limit < 0) { + $limit = 10; + } + + $this->_query['limit'] = $limit; + + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/getsatisfaction/product.php b/library/eden/getsatisfaction/product.php index 834a581..2a9d3e9 100644 --- a/library/eden/getsatisfaction/product.php +++ b/library/eden/getsatisfaction/product.php @@ -1,174 +1,174 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Get Satisfaction Product Methods - * - * @package Eden - * @category getsatisfaction - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_GetSatisfaction_Product extends Eden_GetSatisfaction_Base { - /* Constants - -------------------------------*/ - const URL_LIST = 'http://api.getsatisfaction.com/products.json'; - const URL_COMPANY = 'http://api.getsatisfaction.com/companies/%s/products.json'; - const URL_PEOPLE = 'http://api.getsatisfaction.com/people/%s/products.json'; - const URL_TOPIC = 'http://api.getsatisfaction.com/topics/%s/products.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_query = array(); - protected $_url = self::URL_LIST; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns a list of companies - * - * @return array - */ - public function getResponse() { - return $this->_getResponse($this->_url, $this->_query); - } - - /** - * Filter by keyword - * - * @param string - * @return this - */ - public function filterByKeyword($keyword) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string'); - - $this->_query['query'] = $keyword; - - return $this; - } - - /** - * Sets company URL - * - * @param string|int - * @return this - */ - public function searchByCompany($company) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_COMPANY, $company); - return $this; - } - - /** - * Sets topic URL - * - * @param string|int - * @return this - */ - public function searchByTopic($topic) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_TOPIC, $topic); - return $this; - } - - /** - * Sets user URL - * - * @param int|string - * @return this - */ - public function searchByUser($user) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_PEOPLE, $user); - return $this; - } - - /** - * Set page - * - * @param int - * @return this - */ - public function setPage($page = 0) { - Eden_Getsatisfaction_Error::i()->argument(1, 'int'); - - if($page < 0) { - $page = 0; - } - - $this->_query['page'] = $page; - - return $this; - } - - /** - * Set range - * - * @param int - * @return this - */ - public function setRange($limit = 10) { - Eden_Getsatisfaction_Error::i()->argument(1, 'int'); - - if($limit < 0) { - $limit = 10; - } - - $this->_query['limit'] = $limit; - - return $this; - } - - /** - * Sort by letters - * - * @return this - */ - public function sortByAlphabet() { - $this->_query['sort'] = 'alpha'; - return $this; - } - - /** - * Sort by lame - * - * @return this - */ - public function sortByLeastPopular() { - $this->_query['sort'] = 'least_popular'; - return $this; - } - - /** - * Sort by popular - * - * @return this - */ - public function sortByMostPopular() { - $this->_query['sort'] = 'most_popular'; - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Get Satisfaction Product Methods + * + * @package Eden + * @category getsatisfaction + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_GetSatisfaction_Product extends Eden_GetSatisfaction_Base { + /* Constants + -------------------------------*/ + const URL_LIST = 'http://api.getsatisfaction.com/products.json'; + const URL_COMPANY = 'http://api.getsatisfaction.com/companies/%s/products.json'; + const URL_PEOPLE = 'http://api.getsatisfaction.com/people/%s/products.json'; + const URL_TOPIC = 'http://api.getsatisfaction.com/topics/%s/products.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_query = array(); + protected $_url = self::URL_LIST; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns a list of companies + * + * @return array + */ + public function getResponse() { + return $this->_getResponse($this->_url, $this->_query); + } + + /** + * Filter by keyword + * + * @param string + * @return this + */ + public function filterByKeyword($keyword) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string'); + + $this->_query['query'] = $keyword; + + return $this; + } + + /** + * Sets company URL + * + * @param string|int + * @return this + */ + public function searchByCompany($company) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_COMPANY, $company); + return $this; + } + + /** + * Sets topic URL + * + * @param string|int + * @return this + */ + public function searchByTopic($topic) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_TOPIC, $topic); + return $this; + } + + /** + * Sets user URL + * + * @param int|string + * @return this + */ + public function searchByUser($user) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_PEOPLE, $user); + return $this; + } + + /** + * Set page + * + * @param int + * @return this + */ + public function setPage($page = 0) { + Eden_Getsatisfaction_Error::i()->argument(1, 'int'); + + if($page < 0) { + $page = 0; + } + + $this->_query['page'] = $page; + + return $this; + } + + /** + * Set range + * + * @param int + * @return this + */ + public function setRange($limit = 10) { + Eden_Getsatisfaction_Error::i()->argument(1, 'int'); + + if($limit < 0) { + $limit = 10; + } + + $this->_query['limit'] = $limit; + + return $this; + } + + /** + * Sort by letters + * + * @return this + */ + public function sortByAlphabet() { + $this->_query['sort'] = 'alpha'; + return $this; + } + + /** + * Sort by lame + * + * @return this + */ + public function sortByLeastPopular() { + $this->_query['sort'] = 'least_popular'; + return $this; + } + + /** + * Sort by popular + * + * @return this + */ + public function sortByMostPopular() { + $this->_query['sort'] = 'most_popular'; + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/getsatisfaction/replies.php b/library/eden/getsatisfaction/replies.php index 8343412..2c3212b 100644 --- a/library/eden/getsatisfaction/replies.php +++ b/library/eden/getsatisfaction/replies.php @@ -1,161 +1,161 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Get Satisfaction Reply Methods - * - * @package Eden - * @category getsatisfaction - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Getsatisfaction_Replies extends Eden_Getsatisfaction_Base { - /* Constants - -------------------------------*/ - const URL_LIST = 'http://api.getsatisfaction.com/replies.json'; - const URL_TOPIC = 'http://api.getsatisfaction.com/topics/%s/replies.json'; - const URL_PEOPLE = 'http://api.getsatisfaction.com/people/%s/replies.json'; - const URL_REPLY = 'http://api.getsatisfaction.com/topics/%s/replies'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_query = array(); - protected $_url = self::URL_LIST; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - - /** - * Filter by best - * - * @return this - */ - public function filterByBest() { - $this->_query['filter'] = 'best'; - - return $this; - } - - /** - * Filter by company promoted - * - * @return this - */ - public function filterByCompanyPromoted() { - $this->_query['filter'] = 'company_promoted'; - - return $this; - } - - /** - * Filter by flat promoted - * - * @return this - */ - public function filterByFlatPromoted() { - $this->_query['filter'] = 'flat_promoted'; - - return $this; - } - - /** - * Filter by star promoted - * - * @return this - */ - public function filterByStarPromoted() { - $this->_query['filter'] = 'star_promoted'; - - return $this; - } - - /** - * Returns a list of companies - * - * @return array - */ - public function getResponse() { - return $this->_getResponse($this->_url, $this->_query); - } - - /** - * Sets topic URL - * - * @param string|int - * @return this - */ - public function searchByTopic($topic) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_TOPIC, $topic); - return $this; - } - /** - * Sets user URL - * - * @param int|string - * @return this - */ - public function searchByUser($user) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_PEOPLE, $user); - return $this; - } - - /** - * Set page - * - * @param int - * @return this - */ - public function setPage($page = 0) { - Eden_Getsatisfaction_Error::i()->argument(1, 'int'); - - if($page < 0) { - $page = 0; - } - - $this->_query['page'] = $page; - - return $this; - } - - /** - * Set range - * - * @param int - * @return this - */ - public function setRange($limit = 10) { - Eden_Getsatisfaction_Error::i()->argument(1, 'int'); - - if($limit < 0) { - $limit = 10; - } - - $this->_query['limit'] = $limit; - - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Get Satisfaction Reply Methods + * + * @package Eden + * @category getsatisfaction + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Getsatisfaction_Replies extends Eden_Getsatisfaction_Base { + /* Constants + -------------------------------*/ + const URL_LIST = 'http://api.getsatisfaction.com/replies.json'; + const URL_TOPIC = 'http://api.getsatisfaction.com/topics/%s/replies.json'; + const URL_PEOPLE = 'http://api.getsatisfaction.com/people/%s/replies.json'; + const URL_REPLY = 'http://api.getsatisfaction.com/topics/%s/replies'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_query = array(); + protected $_url = self::URL_LIST; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + + /** + * Filter by best + * + * @return this + */ + public function filterByBest() { + $this->_query['filter'] = 'best'; + + return $this; + } + + /** + * Filter by company promoted + * + * @return this + */ + public function filterByCompanyPromoted() { + $this->_query['filter'] = 'company_promoted'; + + return $this; + } + + /** + * Filter by flat promoted + * + * @return this + */ + public function filterByFlatPromoted() { + $this->_query['filter'] = 'flat_promoted'; + + return $this; + } + + /** + * Filter by star promoted + * + * @return this + */ + public function filterByStarPromoted() { + $this->_query['filter'] = 'star_promoted'; + + return $this; + } + + /** + * Returns a list of companies + * + * @return array + */ + public function getResponse() { + return $this->_getResponse($this->_url, $this->_query); + } + + /** + * Sets topic URL + * + * @param string|int + * @return this + */ + public function searchByTopic($topic) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_TOPIC, $topic); + return $this; + } + /** + * Sets user URL + * + * @param int|string + * @return this + */ + public function searchByUser($user) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_PEOPLE, $user); + return $this; + } + + /** + * Set page + * + * @param int + * @return this + */ + public function setPage($page = 0) { + Eden_Getsatisfaction_Error::i()->argument(1, 'int'); + + if($page < 0) { + $page = 0; + } + + $this->_query['page'] = $page; + + return $this; + } + + /** + * Set range + * + * @param int + * @return this + */ + public function setRange($limit = 10) { + Eden_Getsatisfaction_Error::i()->argument(1, 'int'); + + if($limit < 0) { + $limit = 10; + } + + $this->_query['limit'] = $limit; + + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/getsatisfaction/tag.php b/library/eden/getsatisfaction/tag.php index 73c38d4..51778da 100644 --- a/library/eden/getsatisfaction/tag.php +++ b/library/eden/getsatisfaction/tag.php @@ -1,116 +1,116 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Get Satisfaction Tag Methods - * - * @package Eden - * @category getsatisfaction - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_GetSatisfaction_Tag extends Eden_GetSatisfaction_Base { - /* Constants - -------------------------------*/ - const URL_LIST = 'http://api.getsatisfaction.com/tags.json'; - const URL_TOPIC = 'http://api.getsatisfaction.com/topics/%s/tags.json'; - const URL_COMPANY = 'http://api.getsatisfaction.com/companies/%s/tags.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_query = array(); - protected $_url = self::URL_LIST; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns a list of companies - * - * @return array - */ - public function getResponse() { - return $this->_getResponse($this->_url, $this->_query); - } - - /** - * Sets company URL - * - * @param string|int - * @return this - */ - public function searchByCompany($company) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_COMPANY, $company); - return $this; - } - - /** - * Sets topic URL - * - * @param string|int - * @return this - */ - public function searchByTopic($topic) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_TOPIC, $topic); - return $this; - } - - /** - * Set page - * - * @param int - * @return this - */ - public function setPage($page = 0) { - Eden_Getsatisfaction_Error::i()->argument(1, 'int'); - - if($page < 0) { - $page = 0; - } - - $this->_query['page'] = $page; - - return $this; - } - - /** - * Set range - * - * @param int - * @return this - */ - public function setRange($limit = 10) { - Eden_Getsatisfaction_Error::i()->argument(1, 'int'); - - if($limit < 0) { - $limit = 10; - } - - $this->_query['limit'] = $limit; - - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Get Satisfaction Tag Methods + * + * @package Eden + * @category getsatisfaction + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_GetSatisfaction_Tag extends Eden_GetSatisfaction_Base { + /* Constants + -------------------------------*/ + const URL_LIST = 'http://api.getsatisfaction.com/tags.json'; + const URL_TOPIC = 'http://api.getsatisfaction.com/topics/%s/tags.json'; + const URL_COMPANY = 'http://api.getsatisfaction.com/companies/%s/tags.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_query = array(); + protected $_url = self::URL_LIST; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns a list of companies + * + * @return array + */ + public function getResponse() { + return $this->_getResponse($this->_url, $this->_query); + } + + /** + * Sets company URL + * + * @param string|int + * @return this + */ + public function searchByCompany($company) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_COMPANY, $company); + return $this; + } + + /** + * Sets topic URL + * + * @param string|int + * @return this + */ + public function searchByTopic($topic) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_TOPIC, $topic); + return $this; + } + + /** + * Set page + * + * @param int + * @return this + */ + public function setPage($page = 0) { + Eden_Getsatisfaction_Error::i()->argument(1, 'int'); + + if($page < 0) { + $page = 0; + } + + $this->_query['page'] = $page; + + return $this; + } + + /** + * Set range + * + * @param int + * @return this + */ + public function setRange($limit = 10) { + Eden_Getsatisfaction_Error::i()->argument(1, 'int'); + + if($limit < 0) { + $limit = 10; + } + + $this->_query['limit'] = $limit; + + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/getsatisfaction/topic.php b/library/eden/getsatisfaction/topic.php index 75cb13c..0cdf71e 100644 --- a/library/eden/getsatisfaction/topic.php +++ b/library/eden/getsatisfaction/topic.php @@ -1,450 +1,450 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Get Satisfaction Topic Methods - * - * @package Eden - * @category getsatisfaction - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_GetSatisfaction_Topic extends Eden_GetSatisfaction_Base { - /* Constants - -------------------------------*/ - const URL_LIST = 'http://api.getsatisfaction.com/topics.json'; - const URL_COMPANY = 'http://api.getsatisfaction.com/companies/%s/topics.json'; - const URL_COMPANY_PRODUCT = 'http://api.getsatisfaction.com/companies/%s/products/%s/topics.json'; - const URL_COMPANY_TAG = 'http://api.getsatisfaction.com/companies/%s/tags/%s/topics.json'; - const URL_PEOPLE = 'http://api.getsatisfaction.com/people/%s/topics.json'; - const URL_PEOPLE_FOLLOWED = 'http://api.getsatisfaction.com/people/%s/followed/topics.json'; - const URL_PRODUCT = 'http://api.getsatisfaction.com/products/%s/topics.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_query = array(); - protected $_url = self::URL_LIST; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - - /** - * Filter by company - * - * @param string|int - * @return this - */ - public function filterByCompany($company) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_query['company'] = $company; - - return $this; - } - - /** - * Filter by defined - * - * @param string|int - * @return this - */ - public function filterByDefined($defined) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_query['user_defined_code'] = $defined; - - return $this; - } - - /** - * Filter by product - * - * @param string|int|array - * @return this - */ - public function filterByProduct($product) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int', 'array'); - - if(is_array($product)) { - $product = implode(',', $product); - } - - $this->_query['product'] = $product; - - return $this; - } - - /** - * Filter by since - * - * @param string|int - * @return this - */ - public function filterBySince($since) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - if(is_string($since)) { - $since = strtotime($since); - } - - $this->_query['active_since'] = $since; - - return $this; - } - - /** - * Filter by active status - * - * @return this - */ - public function filterByStatusActive() { - if(!isset($this->_filter['status']) || !in_array('active', $this->_filter['status'])) { - $this->_filter['status'][] = 'active'; - } - - return $this; - } - - /** - * Filter by complete status - * - * @return this - */ - public function filterByStatusComplete() { - if(!isset($this->_filter['status']) || !in_array('complete', $this->_filter['status'])) { - $this->_filter['status'][] = 'complete'; - } - - return $this; - } - - /** - * Filter by no status - * - * @return this - */ - public function filterByStatusNone() { - if(!isset($this->_filter['status']) || !in_array('none', $this->_filter['status'])) { - $this->_filter['status'][] = 'none'; - } - - return $this; - } - - /** - * Filter by pending status - * - * @return this - */ - public function filterByStatusPending() { - if(!isset($this->_filter['status']) || !in_array('pending', $this->_filter['status'])) { - $this->_filter['status'][] = 'pending'; - } - - return $this; - } - - /** - * Filter by rejected status - * - * @return this - */ - public function filterByStatusRejected() { - if(!isset($this->_filter['status']) || !in_array('rejected', $this->_filter['status'])) { - $this->_filter['status'][] = 'rejected'; - } - - return $this; - } - - /** - * Filter by tag - * - * @param string - * @return this - */ - public function filterByTag($tag) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string'); - - $this->_query['tag'] = $tag; - - return $this; - } - - /** - * Filter by user - * - * @param string|int - * @return this - */ - public function filterByUser($user) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_query['user'] = $user; - - return $this; - } - - /** - * Returns a list of companies - * - * @return array - */ - public function getResponse() { - if(isset($this->_query['status']) && is_array($this->_query['status'])) { - $this->_query['status'] = implode(',', $this->_query['status']); - } - - return $this->_getResponse($this->_url, $this->_query); - } - - /** - * Sets company URL - * - * @param string|int - * @return this - */ - public function setCompany($company) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_COMPANY, $company); - return $this; - } - - /** - * Sets company URL - * - * @param string|int - * @param string|int - * @return this - */ - public function setCompanyProduct($company, $product) { - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string', 'int') - ->argument(2, 'string', 'int'); - - $this->_url = sprintf(self::URL_COMPANY_PRODUCT, $company, $product); - return $this; - } - - /** - * Sets company URL - * - * @param string|int - * @param string|int - * @return this - */ - public function setCompanyTag($company, $tag) { - Eden_Getsatisfaction_Error::i() - ->argument(1, 'string', 'int') - ->argument(2, 'string', 'int'); - - $this->_url = sprintf(self::URL_COMPANY_TAG, $company, $tag); - return $this; - } - - /** - * Sets company URL - * - * @param string|int - * @return this - */ - public function setFollowed($user) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_PEOPLE_FOLLOWED, $user); - return $this; - } - - /** - * Set page - * - * @param int - * @return this - */ - public function setPage($page = 0) { - Eden_Getsatisfaction_Error::i()->argument(1, 'int'); - - if($page < 0) { - $page = 0; - } - - $this->_query['page'] = $page; - - return $this; - } - - /** - * Sets company URL - * - * @param string|int - * @return this - */ - public function setProduct($product) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_PRODUCT, $product); - return $this; - } - - /** - * Set range - * - * @param int - * @return this - */ - public function setRange($limit = 10) { - Eden_Getsatisfaction_Error::i()->argument(1, 'int'); - - if($limit < 0) { - $limit = 10; - } - - $this->_query['limit'] = $limit; - - return $this; - } - - /** - * Sets company URL - * - * @param string|int - * @return this - */ - public function setUser($user) { - Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); - - $this->_url = sprintf(self::URL_PEOPLE, $user); - return $this; - } - /** - * Sort by updates - * - * @return this - */ - public function showUpdates() { - $this->_query['style'] = 'update'; - return $this; - } - - /** - * Sort by ideas - * - * @return this - */ - public function showIdeas() { - $this->_query['style'] = 'idea'; - return $this; - } - - /** - * Sort by praise - * - * @return this - */ - public function showPraise() { - $this->_query['style'] = 'praise'; - return $this; - } - - /** - * Sort by problems - * - * @return this - */ - public function showProblems() { - $this->_query['style'] = 'question'; - return $this; - } - - /** - * Sort by questions - * - * @return this - */ - public function showQuestions() { - $this->_query['style'] = 'question'; - return $this; - } - - /** - * Sort by active - * - * @return this - */ - public function sortByActive() { - $this->_query['sort'] = 'recently_active'; - return $this; - } - - /** - * Sort by created - * - * @return this - */ - public function sortByCreated() { - $this->_query['sort'] = 'recently_created'; - return $this; - } - - /** - * Sort by priority - * - * @return this - */ - public function sortByPriority() { - $this->_query['sort'] = 'priority'; - return $this; - } - - /** - * Sort by replies - * - * @return this - */ - public function sortByReplies() { - $this->_query['sort'] = 'most_replies'; - return $this; - } - - /** - * Sort by unanswered - * - * @return this - */ - public function sortByUnanswered() { - $this->_query['sort'] = 'answered'; - return $this; - } - - /** - * Sort by votes - * - * @return this - */ - public function sortByVotes() { - $this->_query['sort'] = 'most_me_toos'; - return $this; - } - - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Get Satisfaction Topic Methods + * + * @package Eden + * @category getsatisfaction + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_GetSatisfaction_Topic extends Eden_GetSatisfaction_Base { + /* Constants + -------------------------------*/ + const URL_LIST = 'http://api.getsatisfaction.com/topics.json'; + const URL_COMPANY = 'http://api.getsatisfaction.com/companies/%s/topics.json'; + const URL_COMPANY_PRODUCT = 'http://api.getsatisfaction.com/companies/%s/products/%s/topics.json'; + const URL_COMPANY_TAG = 'http://api.getsatisfaction.com/companies/%s/tags/%s/topics.json'; + const URL_PEOPLE = 'http://api.getsatisfaction.com/people/%s/topics.json'; + const URL_PEOPLE_FOLLOWED = 'http://api.getsatisfaction.com/people/%s/followed/topics.json'; + const URL_PRODUCT = 'http://api.getsatisfaction.com/products/%s/topics.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_query = array(); + protected $_url = self::URL_LIST; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + + /** + * Filter by company + * + * @param string|int + * @return this + */ + public function filterByCompany($company) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_query['company'] = $company; + + return $this; + } + + /** + * Filter by defined + * + * @param string|int + * @return this + */ + public function filterByDefined($defined) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_query['user_defined_code'] = $defined; + + return $this; + } + + /** + * Filter by product + * + * @param string|int|array + * @return this + */ + public function filterByProduct($product) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int', 'array'); + + if(is_array($product)) { + $product = implode(',', $product); + } + + $this->_query['product'] = $product; + + return $this; + } + + /** + * Filter by since + * + * @param string|int + * @return this + */ + public function filterBySince($since) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + if(is_string($since)) { + $since = strtotime($since); + } + + $this->_query['active_since'] = $since; + + return $this; + } + + /** + * Filter by active status + * + * @return this + */ + public function filterByStatusActive() { + if(!isset($this->_filter['status']) || !in_array('active', $this->_filter['status'])) { + $this->_filter['status'][] = 'active'; + } + + return $this; + } + + /** + * Filter by complete status + * + * @return this + */ + public function filterByStatusComplete() { + if(!isset($this->_filter['status']) || !in_array('complete', $this->_filter['status'])) { + $this->_filter['status'][] = 'complete'; + } + + return $this; + } + + /** + * Filter by no status + * + * @return this + */ + public function filterByStatusNone() { + if(!isset($this->_filter['status']) || !in_array('none', $this->_filter['status'])) { + $this->_filter['status'][] = 'none'; + } + + return $this; + } + + /** + * Filter by pending status + * + * @return this + */ + public function filterByStatusPending() { + if(!isset($this->_filter['status']) || !in_array('pending', $this->_filter['status'])) { + $this->_filter['status'][] = 'pending'; + } + + return $this; + } + + /** + * Filter by rejected status + * + * @return this + */ + public function filterByStatusRejected() { + if(!isset($this->_filter['status']) || !in_array('rejected', $this->_filter['status'])) { + $this->_filter['status'][] = 'rejected'; + } + + return $this; + } + + /** + * Filter by tag + * + * @param string + * @return this + */ + public function filterByTag($tag) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string'); + + $this->_query['tag'] = $tag; + + return $this; + } + + /** + * Filter by user + * + * @param string|int + * @return this + */ + public function filterByUser($user) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_query['user'] = $user; + + return $this; + } + + /** + * Returns a list of companies + * + * @return array + */ + public function getResponse() { + if(isset($this->_query['status']) && is_array($this->_query['status'])) { + $this->_query['status'] = implode(',', $this->_query['status']); + } + + return $this->_getResponse($this->_url, $this->_query); + } + + /** + * Sets company URL + * + * @param string|int + * @return this + */ + public function setCompany($company) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_COMPANY, $company); + return $this; + } + + /** + * Sets company URL + * + * @param string|int + * @param string|int + * @return this + */ + public function setCompanyProduct($company, $product) { + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string', 'int') + ->argument(2, 'string', 'int'); + + $this->_url = sprintf(self::URL_COMPANY_PRODUCT, $company, $product); + return $this; + } + + /** + * Sets company URL + * + * @param string|int + * @param string|int + * @return this + */ + public function setCompanyTag($company, $tag) { + Eden_Getsatisfaction_Error::i() + ->argument(1, 'string', 'int') + ->argument(2, 'string', 'int'); + + $this->_url = sprintf(self::URL_COMPANY_TAG, $company, $tag); + return $this; + } + + /** + * Sets company URL + * + * @param string|int + * @return this + */ + public function setFollowed($user) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_PEOPLE_FOLLOWED, $user); + return $this; + } + + /** + * Set page + * + * @param int + * @return this + */ + public function setPage($page = 0) { + Eden_Getsatisfaction_Error::i()->argument(1, 'int'); + + if($page < 0) { + $page = 0; + } + + $this->_query['page'] = $page; + + return $this; + } + + /** + * Sets company URL + * + * @param string|int + * @return this + */ + public function setProduct($product) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_PRODUCT, $product); + return $this; + } + + /** + * Set range + * + * @param int + * @return this + */ + public function setRange($limit = 10) { + Eden_Getsatisfaction_Error::i()->argument(1, 'int'); + + if($limit < 0) { + $limit = 10; + } + + $this->_query['limit'] = $limit; + + return $this; + } + + /** + * Sets company URL + * + * @param string|int + * @return this + */ + public function setUser($user) { + Eden_Getsatisfaction_Error::i()->argument(1, 'string', 'int'); + + $this->_url = sprintf(self::URL_PEOPLE, $user); + return $this; + } + /** + * Sort by updates + * + * @return this + */ + public function showUpdates() { + $this->_query['style'] = 'update'; + return $this; + } + + /** + * Sort by ideas + * + * @return this + */ + public function showIdeas() { + $this->_query['style'] = 'idea'; + return $this; + } + + /** + * Sort by praise + * + * @return this + */ + public function showPraise() { + $this->_query['style'] = 'praise'; + return $this; + } + + /** + * Sort by problems + * + * @return this + */ + public function showProblems() { + $this->_query['style'] = 'question'; + return $this; + } + + /** + * Sort by questions + * + * @return this + */ + public function showQuestions() { + $this->_query['style'] = 'question'; + return $this; + } + + /** + * Sort by active + * + * @return this + */ + public function sortByActive() { + $this->_query['sort'] = 'recently_active'; + return $this; + } + + /** + * Sort by created + * + * @return this + */ + public function sortByCreated() { + $this->_query['sort'] = 'recently_created'; + return $this; + } + + /** + * Sort by priority + * + * @return this + */ + public function sortByPriority() { + $this->_query['sort'] = 'priority'; + return $this; + } + + /** + * Sort by replies + * + * @return this + */ + public function sortByReplies() { + $this->_query['sort'] = 'most_replies'; + return $this; + } + + /** + * Sort by unanswered + * + * @return this + */ + public function sortByUnanswered() { + $this->_query['sort'] = 'answered'; + return $this; + } + + /** + * Sort by votes + * + * @return this + */ + public function sortByVotes() { + $this->_query['sort'] = 'most_me_toos'; + return $this; + } + + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google.php b/library/eden/google.php index d262798..0f22ad8 100644 --- a/library/eden/google.php +++ b/library/eden/google.php @@ -1,236 +1,236 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ -require_once dirname(__FILE__).'/oauth2.php'; -require_once dirname(__FILE__).'/template.php'; -require_once dirname(__FILE__).'/google/error.php'; -require_once dirname(__FILE__).'/google/base.php'; -require_once dirname(__FILE__).'/google/oauth.php'; -require_once dirname(__FILE__).'/google/calendar/acl.php'; -require_once dirname(__FILE__).'/google/calendar/calendars.php'; -require_once dirname(__FILE__).'/google/calendar/event.php'; -require_once dirname(__FILE__).'/google/calendar/freebusy.php'; -require_once dirname(__FILE__).'/google/calendar/list.php'; -require_once dirname(__FILE__).'/google/calendar/settings.php'; -require_once dirname(__FILE__).'/google/calendar.php'; -require_once dirname(__FILE__).'/google/checkout/form.php'; -require_once dirname(__FILE__).'/google/drive/changes.php'; -require_once dirname(__FILE__).'/google/drive/children.php'; -require_once dirname(__FILE__).'/google/drive/files.php'; -require_once dirname(__FILE__).'/google/drive/parent.php'; -require_once dirname(__FILE__).'/google/drive/permissions.php'; -require_once dirname(__FILE__).'/google/drive/revisions.php'; -require_once dirname(__FILE__).'/google/drive.php'; -require_once dirname(__FILE__).'/google/contacts/batch.php'; -require_once dirname(__FILE__).'/google/contacts/data.php'; -require_once dirname(__FILE__).'/google/contacts/groups.php'; -require_once dirname(__FILE__).'/google/contacts/photo.php'; -require_once dirname(__FILE__).'/google/contacts.php'; -require_once dirname(__FILE__).'/google/analytics/management.php'; -require_once dirname(__FILE__).'/google/analytics/reporting.php'; -require_once dirname(__FILE__).'/google/analytics/multichannel.php'; -require_once dirname(__FILE__).'/google/analytics.php'; -require_once dirname(__FILE__).'/google/plus/activity.php'; -require_once dirname(__FILE__).'/google/plus/comment.php'; -require_once dirname(__FILE__).'/google/plus/people.php'; -require_once dirname(__FILE__).'/google/plus.php'; -require_once dirname(__FILE__).'/google/maps/direction.php'; -require_once dirname(__FILE__).'/google/maps/distance.php'; -require_once dirname(__FILE__).'/google/maps/elevation.php'; -require_once dirname(__FILE__).'/google/maps/geocoding.php'; -require_once dirname(__FILE__).'/google/maps/image.php'; -require_once dirname(__FILE__).'/google/maps.php'; -require_once dirname(__FILE__).'/google/shortener.php'; -require_once dirname(__FILE__).'/google/youtube/activity.php'; -require_once dirname(__FILE__).'/google/youtube/channel.php'; -require_once dirname(__FILE__).'/google/youtube/comment.php'; -require_once dirname(__FILE__).'/google/youtube/contacts.php'; -require_once dirname(__FILE__).'/google/youtube/favorites.php'; -require_once dirname(__FILE__).'/google/youtube/history.php'; -require_once dirname(__FILE__).'/google/youtube/message.php'; -require_once dirname(__FILE__).'/google/youtube/playlist.php'; -require_once dirname(__FILE__).'/google/youtube/profile.php'; -require_once dirname(__FILE__).'/google/youtube/ratings.php'; -require_once dirname(__FILE__).'/google/youtube/search.php'; -require_once dirname(__FILE__).'/google/youtube/subscription.php'; -require_once dirname(__FILE__).'/google/youtube/upload.php'; -require_once dirname(__FILE__).'/google/youtube/video.php'; -require_once dirname(__FILE__).'/google/youtube.php'; - -/** - * Google API factory. This is a factory class with - * methods that will load up different google classes. - * Google classes are organized as described on their - * developer site: analytics, calendar ,contacts ,drive, plus and youtube. - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /** - * Returns google analytics methods - * - * @param *string - * @param *string - * @param *url - * @param *string - * @return Eden_Google_Oauth - */ - public function auth($clientId, $clientSecret, $redirect, $apiKey = NULL ) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'url') //Argument 3 must be a url - ->argument(4, 'string', 'null'); //Argument 4 must be a string - - return Eden_Google_Oauth::i($clientId, $clientSecret, $redirect, $apiKey); - } - - /** - * Returns google analytics methods - * - * @param *string - * @return Eden_Google_Analytics - */ - public function analytics($token) { - //Argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - return Eden_Google_Analytics::i($token); - } - - /** - * Returns google calendar methods - * - * @param *string - * @return Eden_Google_Calendar - */ - public function calendar($token) { - //Argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - return Eden_Google_Calendar::i($token); - } - - /** - * Returns google checkout methods - * - * @param *string - * @return Eden_Google_Checkout_Form - */ - public function checkout($merchantId) { - //Argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - return Eden_Google_Checkout_Form::i($merchantId); - } - - /** - * Returns google contacts methods - * - * @param *string - * @return Eden_Google_Contacts - */ - public function contacts($token) { - //Argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - return Eden_Google_Contacts::i($token); - } - - /** - * Returns google drive methods - * - * @param *string - * @return Eden_Google_Drive - */ - public function drive($token) { - //Argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - return Eden_Google_Drive::i($token); - } - - /** - * Returns google maps methods - * - * @param *string - * @return Eden_Google_Maps - */ - public function maps($token) { - //Argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - return Eden_Google_Maps::i($token); - } - - /** - * Returns google plus methods - * - * @param *string - * @return Eden_Google_Plus - */ - public function plus($token) { - //Argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - return Eden_Google_Plus::i($token); - } - - /** - * Returns google shortener methods - * - * @param *string API key - * @return Eden_Google_Plus - */ - public function shortener($key) { - //Argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - return Eden_Google_Shortener::i($key); - } - - /** - * Returns google youtube methods - * - * @param *string - * @param *string - * @return Eden_Google_Youtube - */ - public function youtube($token, $developerId) { - //Argument Testing - Eden_Google_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string'); //Argument 2 must be a string - - return Eden_Google_Youtube::i($token, $developerId); - } - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ +require_once dirname(__FILE__).'/oauth2.php'; +require_once dirname(__FILE__).'/template.php'; +require_once dirname(__FILE__).'/google/error.php'; +require_once dirname(__FILE__).'/google/base.php'; +require_once dirname(__FILE__).'/google/oauth.php'; +require_once dirname(__FILE__).'/google/calendar/acl.php'; +require_once dirname(__FILE__).'/google/calendar/calendars.php'; +require_once dirname(__FILE__).'/google/calendar/event.php'; +require_once dirname(__FILE__).'/google/calendar/freebusy.php'; +require_once dirname(__FILE__).'/google/calendar/list.php'; +require_once dirname(__FILE__).'/google/calendar/settings.php'; +require_once dirname(__FILE__).'/google/calendar.php'; +require_once dirname(__FILE__).'/google/checkout/form.php'; +require_once dirname(__FILE__).'/google/drive/changes.php'; +require_once dirname(__FILE__).'/google/drive/children.php'; +require_once dirname(__FILE__).'/google/drive/files.php'; +require_once dirname(__FILE__).'/google/drive/parent.php'; +require_once dirname(__FILE__).'/google/drive/permissions.php'; +require_once dirname(__FILE__).'/google/drive/revisions.php'; +require_once dirname(__FILE__).'/google/drive.php'; +require_once dirname(__FILE__).'/google/contacts/batch.php'; +require_once dirname(__FILE__).'/google/contacts/data.php'; +require_once dirname(__FILE__).'/google/contacts/groups.php'; +require_once dirname(__FILE__).'/google/contacts/photo.php'; +require_once dirname(__FILE__).'/google/contacts.php'; +require_once dirname(__FILE__).'/google/analytics/management.php'; +require_once dirname(__FILE__).'/google/analytics/reporting.php'; +require_once dirname(__FILE__).'/google/analytics/multichannel.php'; +require_once dirname(__FILE__).'/google/analytics.php'; +require_once dirname(__FILE__).'/google/plus/activity.php'; +require_once dirname(__FILE__).'/google/plus/comment.php'; +require_once dirname(__FILE__).'/google/plus/people.php'; +require_once dirname(__FILE__).'/google/plus.php'; +require_once dirname(__FILE__).'/google/maps/direction.php'; +require_once dirname(__FILE__).'/google/maps/distance.php'; +require_once dirname(__FILE__).'/google/maps/elevation.php'; +require_once dirname(__FILE__).'/google/maps/geocoding.php'; +require_once dirname(__FILE__).'/google/maps/image.php'; +require_once dirname(__FILE__).'/google/maps.php'; +require_once dirname(__FILE__).'/google/shortener.php'; +require_once dirname(__FILE__).'/google/youtube/activity.php'; +require_once dirname(__FILE__).'/google/youtube/channel.php'; +require_once dirname(__FILE__).'/google/youtube/comment.php'; +require_once dirname(__FILE__).'/google/youtube/contacts.php'; +require_once dirname(__FILE__).'/google/youtube/favorites.php'; +require_once dirname(__FILE__).'/google/youtube/history.php'; +require_once dirname(__FILE__).'/google/youtube/message.php'; +require_once dirname(__FILE__).'/google/youtube/playlist.php'; +require_once dirname(__FILE__).'/google/youtube/profile.php'; +require_once dirname(__FILE__).'/google/youtube/ratings.php'; +require_once dirname(__FILE__).'/google/youtube/search.php'; +require_once dirname(__FILE__).'/google/youtube/subscription.php'; +require_once dirname(__FILE__).'/google/youtube/upload.php'; +require_once dirname(__FILE__).'/google/youtube/video.php'; +require_once dirname(__FILE__).'/google/youtube.php'; + +/** + * Google API factory. This is a factory class with + * methods that will load up different google classes. + * Google classes are organized as described on their + * developer site: analytics, calendar ,contacts ,drive, plus and youtube. + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /** + * Returns google analytics methods + * + * @param *string + * @param *string + * @param *url + * @param *string + * @return Eden_Google_Oauth + */ + public function auth($clientId, $clientSecret, $redirect, $apiKey = NULL ) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'url') //Argument 3 must be a url + ->argument(4, 'string', 'null'); //Argument 4 must be a string + + return Eden_Google_Oauth::i($clientId, $clientSecret, $redirect, $apiKey); + } + + /** + * Returns google analytics methods + * + * @param *string + * @return Eden_Google_Analytics + */ + public function analytics($token) { + //Argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + return Eden_Google_Analytics::i($token); + } + + /** + * Returns google calendar methods + * + * @param *string + * @return Eden_Google_Calendar + */ + public function calendar($token) { + //Argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + return Eden_Google_Calendar::i($token); + } + + /** + * Returns google checkout methods + * + * @param *string + * @return Eden_Google_Checkout_Form + */ + public function checkout($merchantId) { + //Argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + return Eden_Google_Checkout_Form::i($merchantId); + } + + /** + * Returns google contacts methods + * + * @param *string + * @return Eden_Google_Contacts + */ + public function contacts($token) { + //Argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + return Eden_Google_Contacts::i($token); + } + + /** + * Returns google drive methods + * + * @param *string + * @return Eden_Google_Drive + */ + public function drive($token) { + //Argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + return Eden_Google_Drive::i($token); + } + + /** + * Returns google maps methods + * + * @param *string + * @return Eden_Google_Maps + */ + public function maps($token) { + //Argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + return Eden_Google_Maps::i($token); + } + + /** + * Returns google plus methods + * + * @param *string + * @return Eden_Google_Plus + */ + public function plus($token) { + //Argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + return Eden_Google_Plus::i($token); + } + + /** + * Returns google shortener methods + * + * @param *string API key + * @return Eden_Google_Plus + */ + public function shortener($key) { + //Argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + return Eden_Google_Shortener::i($key); + } + + /** + * Returns google youtube methods + * + * @param *string + * @param *string + * @return Eden_Google_Youtube + */ + public function youtube($token, $developerId) { + //Argument Testing + Eden_Google_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string'); //Argument 2 must be a string + + return Eden_Google_Youtube::i($token, $developerId); + } + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/analytics.php b/library/eden/google/analytics.php index f141c94..11e177d 100644 --- a/library/eden/google/analytics.php +++ b/library/eden/google/analytics.php @@ -1,71 +1,71 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google Analytics - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Analytics extends Eden_Google_Base { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($token) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - $this->_token = $token; - } - - /* Public Methods - -------------------------------*/ - /** - * Returns Google analytics management - * - * @return Eden_Google_Analytics_Management - */ - public function management() { - return Eden_Google_Analytics_Management::i($this->_token); - } - - /** - * Returns Google analytics reporting - * - * @return Eden_Google_Analytics_Reporting - */ - public function reporting() { - return Eden_Google_Analytics_Reporting::i($this->_token); - } - - /** - * Returns Google analytics multichannel - * - * @return Eden_Google_Analytics_Multichannel - */ - public function multiChannel() { - return Eden_Google_Analytics_Multichannel::i($this->_token); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google Analytics + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Analytics extends Eden_Google_Base { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($token) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + $this->_token = $token; + } + + /* Public Methods + -------------------------------*/ + /** + * Returns Google analytics management + * + * @return Eden_Google_Analytics_Management + */ + public function management() { + return Eden_Google_Analytics_Management::i($this->_token); + } + + /** + * Returns Google analytics reporting + * + * @return Eden_Google_Analytics_Reporting + */ + public function reporting() { + return Eden_Google_Analytics_Reporting::i($this->_token); + } + + /** + * Returns Google analytics multichannel + * + * @return Eden_Google_Analytics_Multichannel + */ + public function multiChannel() { + return Eden_Google_Analytics_Multichannel::i($this->_token); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/calendar.php b/library/eden/google/calendar.php index 9f9a730..4b78573 100644 --- a/library/eden/google/calendar.php +++ b/library/eden/google/calendar.php @@ -1,110 +1,110 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google Calendar API Factory - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Calendar extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_CALENDAR_COLOR = 'https://www.googleapis.com/calendar/v3/colors'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($token) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - $this->_token = $token; - } - - /* Public Methods - -------------------------------*/ - /** - * Returns Google acl - * - * @return Eden_Google_Calendar_acl - */ - public function acl() { - return Eden_Google_Calendar_Acl::i($this->_token); - } - - /** - * Returns Google Calendars - * - * @return Eden_Google_Calendar_Calendars - */ - public function calendars() { - return Eden_Google_Calendar_Calendars::i($this->_token); - } - - /** - * Returns the color definitions for - * calendars and events. - * - * @return array - */ - public function getColors() { - return $this->_getResponse(self::URL_CALENDAR_COLOR); - } - - /** - * Returns Google Event - * - * @return Eden_Google_Calendar_Event - */ - public function event() { - return Eden_Google_Calendar_Event::i($this->_token); - } - - /** - * Returns Google freebusy - * - * @return Eden_Google_Calendar_freebusy - */ - public function freebusy() { - return Eden_Google_Calendar_Freebusy::i($this->_token); - } - - /** - * Returns Google List - * - * @return Eden_Google_Calendar_List - */ - public function lists() { - return Eden_Google_Calendar_List::i($this->_token); - } - - /** - * Returns Google setting - * - * @return Eden_Google_Calendar_Settings - */ - public function settings() { - return Eden_Google_Calendar_Settings::i($this->_token); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google Calendar API Factory + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Calendar extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_CALENDAR_COLOR = 'https://www.googleapis.com/calendar/v3/colors'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($token) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + $this->_token = $token; + } + + /* Public Methods + -------------------------------*/ + /** + * Returns Google acl + * + * @return Eden_Google_Calendar_acl + */ + public function acl() { + return Eden_Google_Calendar_Acl::i($this->_token); + } + + /** + * Returns Google Calendars + * + * @return Eden_Google_Calendar_Calendars + */ + public function calendars() { + return Eden_Google_Calendar_Calendars::i($this->_token); + } + + /** + * Returns the color definitions for + * calendars and events. + * + * @return array + */ + public function getColors() { + return $this->_getResponse(self::URL_CALENDAR_COLOR); + } + + /** + * Returns Google Event + * + * @return Eden_Google_Calendar_Event + */ + public function event() { + return Eden_Google_Calendar_Event::i($this->_token); + } + + /** + * Returns Google freebusy + * + * @return Eden_Google_Calendar_freebusy + */ + public function freebusy() { + return Eden_Google_Calendar_Freebusy::i($this->_token); + } + + /** + * Returns Google List + * + * @return Eden_Google_Calendar_List + */ + public function lists() { + return Eden_Google_Calendar_List::i($this->_token); + } + + /** + * Returns Google setting + * + * @return Eden_Google_Calendar_Settings + */ + public function settings() { + return Eden_Google_Calendar_Settings::i($this->_token); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/contacts/batch.php b/library/eden/google/contacts/batch.php index ebd910b..f0bf7da 100644 --- a/library/eden/google/contacts/batch.php +++ b/library/eden/google/contacts/batch.php @@ -1,187 +1,187 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google contacts batch - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Contacts_Batch extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_CONTACTS_GROUPS_LIST = 'https://www.google.com/m8/feeds/groups/%s/full'; - const URL_CONTACTS_GROUPS_GET = 'https://www.google.com/m8/feeds/groups/%s/full/%s'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_userEmail = 'default'; - protected $_version = '3.0'; - protected $_title = NULL; - protected $_description = NULL; - protected $_info = NULL; - protected $_groupId = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($token) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - $this->_token = $token; - } - - /* Public Methods - -------------------------------*/ - /** - * Set user email - * - * @param string - * @return this - */ - public function setUserEmail($userEmail) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - $this->_userEmail = $userEmail; - - return $this; - } - - /** - * Set user email - * - * @param string - * @return this - */ - public function setGroupId($groupId) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - $this->_groupId = $groupId; - - return $this; - } - - /** - * Set group title - * - * @param string - * @return this - */ - public function setTitle($title) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - $this->_title = $title; - - return $this; - } - - /** - * Set group description - * - * @param string - * @return this - */ - public function setDescription($description) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - $this->_description = $description; - - return $this; - } - - /** - * Set group description - * - * @param string - * @return this - */ - public function setInfo($info) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - $this->_info = $info; - - return $this; - } - - /** - * Retrieve all group list - * - * @param string - * @return array - */ - public function getList($userEmail = self::DEFAULT_VALUE) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - //populate fields - $query = array(self::VERSION => self::VERSION_THREE); - - return $this->_getResponse(sprintf(self::URL_CONTACTS_GROUPS_LIST, $userEmail), $query); - } - - /** - * Retrieve all group list - * - * @param string - * @param string - * @param string - * @param string - * @return array - */ - public function create($title, $description, $info, $userEmail = self::DEFAULT_VALUE) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string') //argument 2 must be a string - ->argument(3, 'string') //argument 3 must be a string - ->argument(4, 'string'); //argument 4 must be a string - - //populate fields - $parameters = array( - self::TITLE => $title, - self::DESCRIPTION => $description, - self::INFO => $info); - - //make a xml template - $query = Eden_Template::i() - ->set($parameters) - ->parsePHP(dirname(__FILE__).'/template/addgroups.php'); - - return $this->_post(sprintf(self::URL_CONTACTS_GROUPS_LIST, $userEmail), $query); - } - - /** - * Delete a group - * - * @param string - * @param string - * @return array - */ - public function delete($groupId, $userEmail = self::DEFAULT_VALUE) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string'); //argument 2 must be a string - - return $this->_delete(sprintf(self::URL_CONTACTS_GROUPS_GET, $userEmail, $groupId), true); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google contacts batch + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Contacts_Batch extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_CONTACTS_GROUPS_LIST = 'https://www.google.com/m8/feeds/groups/%s/full'; + const URL_CONTACTS_GROUPS_GET = 'https://www.google.com/m8/feeds/groups/%s/full/%s'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_userEmail = 'default'; + protected $_version = '3.0'; + protected $_title = NULL; + protected $_description = NULL; + protected $_info = NULL; + protected $_groupId = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($token) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + $this->_token = $token; + } + + /* Public Methods + -------------------------------*/ + /** + * Set user email + * + * @param string + * @return this + */ + public function setUserEmail($userEmail) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + $this->_userEmail = $userEmail; + + return $this; + } + + /** + * Set user email + * + * @param string + * @return this + */ + public function setGroupId($groupId) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + $this->_groupId = $groupId; + + return $this; + } + + /** + * Set group title + * + * @param string + * @return this + */ + public function setTitle($title) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + $this->_title = $title; + + return $this; + } + + /** + * Set group description + * + * @param string + * @return this + */ + public function setDescription($description) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + $this->_description = $description; + + return $this; + } + + /** + * Set group description + * + * @param string + * @return this + */ + public function setInfo($info) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + $this->_info = $info; + + return $this; + } + + /** + * Retrieve all group list + * + * @param string + * @return array + */ + public function getList($userEmail = self::DEFAULT_VALUE) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + //populate fields + $query = array(self::VERSION => self::VERSION_THREE); + + return $this->_getResponse(sprintf(self::URL_CONTACTS_GROUPS_LIST, $userEmail), $query); + } + + /** + * Retrieve all group list + * + * @param string + * @param string + * @param string + * @param string + * @return array + */ + public function create($title, $description, $info, $userEmail = self::DEFAULT_VALUE) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string') //argument 2 must be a string + ->argument(3, 'string') //argument 3 must be a string + ->argument(4, 'string'); //argument 4 must be a string + + //populate fields + $parameters = array( + self::TITLE => $title, + self::DESCRIPTION => $description, + self::INFO => $info); + + //make a xml template + $query = Eden_Template::i() + ->set($parameters) + ->parsePHP(dirname(__FILE__).'/template/addgroups.php'); + + return $this->_post(sprintf(self::URL_CONTACTS_GROUPS_LIST, $userEmail), $query); + } + + /** + * Delete a group + * + * @param string + * @param string + * @return array + */ + public function delete($groupId, $userEmail = self::DEFAULT_VALUE) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string'); //argument 2 must be a string + + return $this->_delete(sprintf(self::URL_CONTACTS_GROUPS_GET, $userEmail, $groupId), true); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/contacts/data.php b/library/eden/google/contacts/data.php index b48285e..3c4e858 100644 --- a/library/eden/google/contacts/data.php +++ b/library/eden/google/contacts/data.php @@ -1,147 +1,147 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google contacts data - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Contacts_Data extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_CONTACTS_LIST = 'https://www.google.com/m8/feeds/contacts/%s/full'; - const URL_CONTACTS_GET = 'https://www.google.com/m8/feeds/contacts/%s/full/%s'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($token) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - $this->_token = $token; - } - - /* Public Methods - -------------------------------*/ - /** - * Retrieve all of a user's contacts - * - * @param string - * @return array - */ - public function getList($userEmail = self::DEFAULT_VALUE) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - //populate fields - $query = array( - self::VERSION => self::VERSION_THREE, - self::RESPONSE => self::JSON_FORMAT); - - return $this->_getResponse(sprintf(self::URL_CONTACTS_LIST, $userEmail), $query); - } - - /** - * Retrieve a single contact - * - * @param string - * @param string - * @return array - */ - public function getSpecific($contactId, $userEmail = self::DEFAULT_VALUE) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string'); //argument 2 must be a string - - //populate fields - $query = array( - self::VERSION => self::VERSION_THREE, - self::RESPONSE => self::JSON_FORMAT); - - return $this->_getResponse(sprintf(self::URL_CONTACTS_GET, $userEmail, $contactId), $query); - } - - /** - * Creates a contacts. - * - * @param string - * @param string - * @param string - * @param string - * @param string - * @param string - * @param string - * @param string - * @param string - * @param string - * @return array - */ - public function create($givenName, $familyName, $phoneNumber, $city, $street, $postCode, $country, $notes, $email, $userEmail = self::DEFAULT_VALUE) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string') //argument 2 must be a string - ->argument(3, 'string') //argument 3 must be a string - ->argument(4, 'string') //argument 4 must be a string - ->argument(5, 'string') //argument 5 must be a string - ->argument(6, 'string') //argument 6 must be a string - ->argument(7, 'string') //argument 7 must be a string - ->argument(8, 'string') //argument 8 must be a string - ->argument(9, 'string') //argument 9 must be a string - ->argument(10, 'string'); //argument 10 must be a string - - //make a xml template - $query = Eden_Template::i() - ->set(self::GIVEN_NAME, $givenName) - ->set(self::FAMILY_NAME, $familyName) - ->set(self::PHONE_NUMBER, $phoneNumber) - ->set(self::CITY, $city) - ->set(self::STREET, $street) - ->set(self::POST_CODE, $postCode) - ->set(self::COUNTRY, $country) - ->set(self::NOTES, $notes) - ->set(self::EMAIL, $email) - ->parsePHP(dirname(__FILE__).'/template/addcontacts.php'); - - return $this->_post(sprintf(self::URL_CONTACTS_LIST, $userEmail), $query); - } - - /** - * Delete a contact - * - * @return array - * @param string - * @param string - */ - public function delete($contactId, $userEmail = self::DEFAULT_VALUE) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string'); //argument 2 must be a string - - return $this->_delete(sprintf(self::URL_CONTACTS_GET, $userEmail, $contactId), true); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google contacts data + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Contacts_Data extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_CONTACTS_LIST = 'https://www.google.com/m8/feeds/contacts/%s/full'; + const URL_CONTACTS_GET = 'https://www.google.com/m8/feeds/contacts/%s/full/%s'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($token) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + $this->_token = $token; + } + + /* Public Methods + -------------------------------*/ + /** + * Retrieve all of a user's contacts + * + * @param string + * @return array + */ + public function getList($userEmail = self::DEFAULT_VALUE) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + //populate fields + $query = array( + self::VERSION => self::VERSION_THREE, + self::RESPONSE => self::JSON_FORMAT); + + return $this->_getResponse(sprintf(self::URL_CONTACTS_LIST, $userEmail), $query); + } + + /** + * Retrieve a single contact + * + * @param string + * @param string + * @return array + */ + public function getSpecific($contactId, $userEmail = self::DEFAULT_VALUE) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string'); //argument 2 must be a string + + //populate fields + $query = array( + self::VERSION => self::VERSION_THREE, + self::RESPONSE => self::JSON_FORMAT); + + return $this->_getResponse(sprintf(self::URL_CONTACTS_GET, $userEmail, $contactId), $query); + } + + /** + * Creates a contacts. + * + * @param string + * @param string + * @param string + * @param string + * @param string + * @param string + * @param string + * @param string + * @param string + * @param string + * @return array + */ + public function create($givenName, $familyName, $phoneNumber, $city, $street, $postCode, $country, $notes, $email, $userEmail = self::DEFAULT_VALUE) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string') //argument 2 must be a string + ->argument(3, 'string') //argument 3 must be a string + ->argument(4, 'string') //argument 4 must be a string + ->argument(5, 'string') //argument 5 must be a string + ->argument(6, 'string') //argument 6 must be a string + ->argument(7, 'string') //argument 7 must be a string + ->argument(8, 'string') //argument 8 must be a string + ->argument(9, 'string') //argument 9 must be a string + ->argument(10, 'string'); //argument 10 must be a string + + //make a xml template + $query = Eden_Template::i() + ->set(self::GIVEN_NAME, $givenName) + ->set(self::FAMILY_NAME, $familyName) + ->set(self::PHONE_NUMBER, $phoneNumber) + ->set(self::CITY, $city) + ->set(self::STREET, $street) + ->set(self::POST_CODE, $postCode) + ->set(self::COUNTRY, $country) + ->set(self::NOTES, $notes) + ->set(self::EMAIL, $email) + ->parsePHP(dirname(__FILE__).'/template/addcontacts.php'); + + return $this->_post(sprintf(self::URL_CONTACTS_LIST, $userEmail), $query); + } + + /** + * Delete a contact + * + * @return array + * @param string + * @param string + */ + public function delete($contactId, $userEmail = self::DEFAULT_VALUE) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string'); //argument 2 must be a string + + return $this->_delete(sprintf(self::URL_CONTACTS_GET, $userEmail, $contactId), true); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/contacts/groups.php b/library/eden/google/contacts/groups.php index dce5dd8..eb461d2 100644 --- a/library/eden/google/contacts/groups.php +++ b/library/eden/google/contacts/groups.php @@ -1,129 +1,129 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google contacts groups - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Contacts_Groups extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_CONTACTS_GROUPS_LIST = 'https://www.google.com/m8/feeds/groups/%s/full'; - const URL_CONTACTS_GROUPS_GET = 'https://www.google.com/m8/feeds/groups/%s/full/%s'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($token) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - $this->_token = $token; - } - - /* Public Methods - -------------------------------*/ - /** - * Retrieve all group list - * - * @param string - * @return array - */ - public function getList($userEmail = self::DEFAULT_VALUE) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - //populate fields - $query = array( - self::VERSION => self::VERSION_THREE, - self::RESPONSE => self::JSON_FORMAT); - - return $this->_getResponse(sprintf(self::URL_CONTACTS_CONTACTS_LIST, $userEmail), $query); - } - - /** - * Retrieve single group list - * - * @param string - * @param string - * @return array - */ - public function getSpecific($groudId, $userEmail = self::DEFAULT_VALUE) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string'); //argument 2 must be a string - - //populate fields - $query = array( - self::VERSION => self::VERSION_THREE, - self::RESPONSE => self::JSON_FORMAT); - - return $this->_getResponse(sprintf(self::URL_CONTACTS_GROUPS_GET, $userEmail, $groupId), $query); - } - - /** - * Retrieve all group list - * - * @param string - * @param string - * @param string - * @param string - * @return array - */ - public function create($title, $description, $info, $userEmail = self::DEFAULT_VALUE) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string') //argument 2 must be a string - ->argument(3, 'string') //argument 3 must be a string - ->argument(4, 'string'); //argument 4 must be a string - - //make a xml template - $query = Eden_Template::i() - ->set(self::TITLE, $title) - ->set(self::DESCRIPTION, $description) - ->set(self::INFO, $info) - ->parsePHP(dirname(__FILE__).'/template/addgroups.php'); - - return $this->_post(sprintf(self::URL_CONTACTS_GROUPS_LIST, $userEmail), $query); - } - - /** - * Delete a group - * - * @param string - * @param string - * @return array - */ - public function delete($groupId, $userEmail = self::DEFAULT_VALUE) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string'); //argument 2 must be a string - - return $this->_delete(sprintf(self::URL_CONTACTS_GROUPS_GET, $userEmail, $groupId), true); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google contacts groups + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Contacts_Groups extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_CONTACTS_GROUPS_LIST = 'https://www.google.com/m8/feeds/groups/%s/full'; + const URL_CONTACTS_GROUPS_GET = 'https://www.google.com/m8/feeds/groups/%s/full/%s'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($token) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + $this->_token = $token; + } + + /* Public Methods + -------------------------------*/ + /** + * Retrieve all group list + * + * @param string + * @return array + */ + public function getList($userEmail = self::DEFAULT_VALUE) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + //populate fields + $query = array( + self::VERSION => self::VERSION_THREE, + self::RESPONSE => self::JSON_FORMAT); + + return $this->_getResponse(sprintf(self::URL_CONTACTS_CONTACTS_LIST, $userEmail), $query); + } + + /** + * Retrieve single group list + * + * @param string + * @param string + * @return array + */ + public function getSpecific($groudId, $userEmail = self::DEFAULT_VALUE) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string'); //argument 2 must be a string + + //populate fields + $query = array( + self::VERSION => self::VERSION_THREE, + self::RESPONSE => self::JSON_FORMAT); + + return $this->_getResponse(sprintf(self::URL_CONTACTS_GROUPS_GET, $userEmail, $groupId), $query); + } + + /** + * Retrieve all group list + * + * @param string + * @param string + * @param string + * @param string + * @return array + */ + public function create($title, $description, $info, $userEmail = self::DEFAULT_VALUE) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string') //argument 2 must be a string + ->argument(3, 'string') //argument 3 must be a string + ->argument(4, 'string'); //argument 4 must be a string + + //make a xml template + $query = Eden_Template::i() + ->set(self::TITLE, $title) + ->set(self::DESCRIPTION, $description) + ->set(self::INFO, $info) + ->parsePHP(dirname(__FILE__).'/template/addgroups.php'); + + return $this->_post(sprintf(self::URL_CONTACTS_GROUPS_LIST, $userEmail), $query); + } + + /** + * Delete a group + * + * @param string + * @param string + * @return array + */ + public function delete($groupId, $userEmail = self::DEFAULT_VALUE) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string'); //argument 2 must be a string + + return $this->_delete(sprintf(self::URL_CONTACTS_GROUPS_GET, $userEmail, $groupId), true); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/contacts/photo.php b/library/eden/google/contacts/photo.php index dc12242..91ac331 100644 --- a/library/eden/google/contacts/photo.php +++ b/library/eden/google/contacts/photo.php @@ -1,82 +1,82 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google Contacts Photos - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Contacts_Photo extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_CONTACTS_GET_IMAGE = 'https://www.google.com/m8/feeds/photos/media/%s/%s'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($token) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - $this->_token = $token; - } - - /* Public Methods - -------------------------------*/ - /** - * Retrieve a single contact photo - * - * @param string - * @param string - * @return array - */ - public function getImage($contactId, $userEmail = self::DAFAULT) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string'); //argument 2 must be a string - - //populate fields - $query = array( - self::VERSION => self::VERSION_THREE, - self::RESPONSE => self::JSON_FORMAT); - - return $this->_getResponse(sprintf(self::URL_CONTACTS_GET_IMAGE, $userEmail, $contactId), $query); - } - - /** - * Delete a photo - * - * @param string - * @param string - * @return array - */ - public function delete($contactId, $userEmail = self::DAFAULT) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string'); //argument 2 must be a string - - return $this->_delete(sprintf(self::URL_CONTACTS_GET_IMAGE, $userEmail, contactId), true); - } - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google Contacts Photos + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Contacts_Photo extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_CONTACTS_GET_IMAGE = 'https://www.google.com/m8/feeds/photos/media/%s/%s'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($token) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + $this->_token = $token; + } + + /* Public Methods + -------------------------------*/ + /** + * Retrieve a single contact photo + * + * @param string + * @param string + * @return array + */ + public function getImage($contactId, $userEmail = self::DAFAULT) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string'); //argument 2 must be a string + + //populate fields + $query = array( + self::VERSION => self::VERSION_THREE, + self::RESPONSE => self::JSON_FORMAT); + + return $this->_getResponse(sprintf(self::URL_CONTACTS_GET_IMAGE, $userEmail, $contactId), $query); + } + + /** + * Delete a photo + * + * @param string + * @param string + * @return array + */ + public function delete($contactId, $userEmail = self::DAFAULT) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string'); //argument 2 must be a string + + return $this->_delete(sprintf(self::URL_CONTACTS_GET_IMAGE, $userEmail, contactId), true); + } + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/drive.php b/library/eden/google/drive.php index 04ed0b0..a96c4de 100644 --- a/library/eden/google/drive.php +++ b/library/eden/google/drive.php @@ -1,120 +1,120 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google Drive API factory - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Drive extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_DRIVE_ABOUT = 'https://www.googleapis.com/drive/v2/about'; - const URL_DRIVE_APPS = 'hhttps://www.googleapis.com/drive/v2/apps'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($token) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - $this->_token = $token; - } - - /* Public Methods - -------------------------------*/ - /** - * Returns Google Drive Changes - * - * @return Eden_Google_Drive_Changes - */ - public function changes() { - return Eden_Google_Drive_Changes::i($this->_token); - } - - /** - * Returns Google Drive Children - * - * @return Eden_Google_Drive_Children - */ - public function children() { - return Eden_Google_Drive_Children::i($this->_token); - } - - /** - * Returns Google Drive Files - * - * @return Eden_Google_Drive_Files - */ - public function files() { - return Eden_Google_Drive_Files::i($this->_token); - } - - /** - * Gets the information about the - * current user along with Drive API settings - * - * @return array - */ - public function getAbout() { - return $this->_getResponse(self::URL_DRIVE_ABOUT); - } - - /** - * Lists a user's apps. - * - * @return array - */ - public function getApps() { - return $this->_getResponse(self::URL_DRIVE_APPS); - } - - /** - * Returns Google Drive parent - * - * @return Eden_Google_Drive_Parent - */ - public function parents() { - return Eden_Google_Drive_Parent::i($this->_token); - } - - /** - * Returns Google Drive Permissions - * - * @return Eden_Google_Drive_Permissions - */ - public function permissions() { - return Eden_Google_Drive_Permissions::i($this->_token); - } - - /** - * Returns Google Drive Revisions - * - * @return Eden_Google_Drive_Revisions - */ - public function revisions() { - return Eden_Google_Drive_Revisions::i($this->_token); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google Drive API factory + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Drive extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_DRIVE_ABOUT = 'https://www.googleapis.com/drive/v2/about'; + const URL_DRIVE_APPS = 'hhttps://www.googleapis.com/drive/v2/apps'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($token) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + $this->_token = $token; + } + + /* Public Methods + -------------------------------*/ + /** + * Returns Google Drive Changes + * + * @return Eden_Google_Drive_Changes + */ + public function changes() { + return Eden_Google_Drive_Changes::i($this->_token); + } + + /** + * Returns Google Drive Children + * + * @return Eden_Google_Drive_Children + */ + public function children() { + return Eden_Google_Drive_Children::i($this->_token); + } + + /** + * Returns Google Drive Files + * + * @return Eden_Google_Drive_Files + */ + public function files() { + return Eden_Google_Drive_Files::i($this->_token); + } + + /** + * Gets the information about the + * current user along with Drive API settings + * + * @return array + */ + public function getAbout() { + return $this->_getResponse(self::URL_DRIVE_ABOUT); + } + + /** + * Lists a user's apps. + * + * @return array + */ + public function getApps() { + return $this->_getResponse(self::URL_DRIVE_APPS); + } + + /** + * Returns Google Drive parent + * + * @return Eden_Google_Drive_Parent + */ + public function parents() { + return Eden_Google_Drive_Parent::i($this->_token); + } + + /** + * Returns Google Drive Permissions + * + * @return Eden_Google_Drive_Permissions + */ + public function permissions() { + return Eden_Google_Drive_Permissions::i($this->_token); + } + + /** + * Returns Google Drive Revisions + * + * @return Eden_Google_Drive_Revisions + */ + public function revisions() { + return Eden_Google_Drive_Revisions::i($this->_token); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/maps.php b/library/eden/google/maps.php index df9450d..f1ce0c9 100644 --- a/library/eden/google/maps.php +++ b/library/eden/google/maps.php @@ -1,94 +1,94 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google Maps - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Maps extends Eden_Google_Base { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($token) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - $this->_token = $token; - } - - /* Public Methods - -------------------------------*/ - /** - * Returns Google maps direction - * - * @return Eden_Google_Maps_Direction - */ - public function direction() { - - return Eden_Google_Maps_Direction::i($this->_token); - } - - /** - * Returns Google maps distance - * - * @return Eden_Google_Maps_Distance - */ - public function distance() { - - return Eden_Google_Maps_Distance::i($this->_token); - } - - /** - * Returns Google maps elevation - * - * @return Eden_Google_Maps_Elevation - */ - public function elevation() { - - return Eden_Google_Maps_Elevation::i($this->_token); - } - - /** - * Returns Google maps geocoding - * - * @return Eden_Google_Maps_Geocoding - */ - public function geocoding() { - - return Eden_Google_Maps_Geocoding::i($this->_token); - } - - /** - * Returns Google maps image - * - * @return Eden_Google_Maps_Image - */ - public function image() { - - return Eden_Google_Maps_Image::i($this->_token); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google Maps + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Maps extends Eden_Google_Base { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($token) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + $this->_token = $token; + } + + /* Public Methods + -------------------------------*/ + /** + * Returns Google maps direction + * + * @return Eden_Google_Maps_Direction + */ + public function direction() { + + return Eden_Google_Maps_Direction::i($this->_token); + } + + /** + * Returns Google maps distance + * + * @return Eden_Google_Maps_Distance + */ + public function distance() { + + return Eden_Google_Maps_Distance::i($this->_token); + } + + /** + * Returns Google maps elevation + * + * @return Eden_Google_Maps_Elevation + */ + public function elevation() { + + return Eden_Google_Maps_Elevation::i($this->_token); + } + + /** + * Returns Google maps geocoding + * + * @return Eden_Google_Maps_Geocoding + */ + public function geocoding() { + + return Eden_Google_Maps_Geocoding::i($this->_token); + } + + /** + * Returns Google maps image + * + * @return Eden_Google_Maps_Image + */ + public function image() { + + return Eden_Google_Maps_Image::i($this->_token); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/maps/direction.php b/library/eden/google/maps/direction.php index a004d65..7702462 100644 --- a/library/eden/google/maps/direction.php +++ b/library/eden/google/maps/direction.php @@ -1,254 +1,254 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google Map Direction Class - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Maps_Direction extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_MAP_DIRECTION = 'http://maps.googleapis.com/maps/api/directions/json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_apiKey = NULL; - protected $_samples = NULL; - protected $_mode = NULL; - protected $_language = NULL; - protected $_avoid = NULL; - protected $_units = NULL; - protected $_waypoints = NULL; - protected $_alternatives = NULL; - protected $_departureTime = NULL; - protected $_arrivalTime = NULL; - protected $_region = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Set Distance to avoid highways - * - * @return this - */ - public function avoidHighways() { - $this->_avoid = 'highways'; - return $this; - } - - /** - * Set Distance to avoid tolls - * - * @return this - */ - public function avoidTolls() { - $this->_avoid = 'tolls'; - return $this; - } - - /** - * Specifies the mode of transport to use when - * calculating directions is bicycling. - * - * @return this - */ - public function bicycling() { - $this->_mode = 'bicycling'; - return $this; - } - - /** - * Specifies the mode of transport to use when - * calculating directions is driving. - * - * @return this - */ - public function driving() { - $this->_mode = 'driving'; - return $this; - } - - /** - * Requests directions via public transit - * routes. Both arrivalTime and departureTime are - * only valid when mode is set to "transit". - * - * @return this - */ - public function transit() { - $this->_mode = 'transit'; - return $this; - } - - /** - * Specifies the mode of transport to use when - * calculating directions is walking. - * - * @return this - */ - public function walking() { - $this->_mode = 'walking'; - return $this; - } - - /** - * The language in which to return results. - * - * @param string|integer - * @return this - */ - public function setLanguage($language) { - //argument 1 must be a string or integer - Eden_Google_Error::i()->argument(1, 'string', 'int'); - - $this->_language = $language; - - return $this; - } - - /** - * Waypoints alter a route by routing it through the specified location(s) - * - * @param string|integer - * @return this - */ - public function setWaypoints($waypoint) { - //argument 1 must be a string or integer - Eden_Google_Error::i()->argument(1, 'string', 'int'); - - $this->_waypoint = $waypoint; - - return $this; - } - - /** - * The region code - * - * @param string|integer - * @return this - */ - public function setRegion($region) { - //argument 1 must be a string or integer - Eden_Google_Error::i()->argument(1, 'string', 'int'); - - $this->_region = $region; - - return $this; - } - - /** - * Returns distances in miles and feet. - * - * @return this - */ - public function setUnitToImperial() { - $this->_units = 'imperial'; - return $this; - } - - /** - * Specifies that the Directions service may - * provide more than one route alternative in the response. - * - * @return this - */ - public function setAlternatives() { - $this->_alternatives = 'true'; - return $this; - } - - /** - * Specifies the desired time of departure for transit directions as seconds - * -timespamp - * - * @param string|int - * @return this - */ - public function setDepartureTime($departureTime) { - //argument 1 must be a string or integer - Eden_Google_Error::i()->argument(1, 'string', 'int'); - - if(is_string($departureTime)) { - $departureTime = strtotime($departureTime); - } - - $this->_departureTime = $departureTime; - - return $this; - } - - /** - * specifies the desired time of arrival for transit directions as seconds - * -timespamp - * - * @param string|int - * @return this - */ - public function setArrivalTime($arrivalTime) { - //argument 1 must be a string or integer - Eden_Google_Error::i()->argument(1, 'string', 'int'); - - if(is_string($arrivalTime)) { - $arrivalTime = strtotime($arrivalTime); - } - - $this->_arrivalTime = $arrivalTime; - - return $this; - } - - /** - * Returns calculated directions between locations - * - * @param string|integer|float The address or textual latitude/longitude value from which you wish to calculate directions - * @param string|integer|float The address or textual latitude/longitude value from which you wish to calculate directions - * @param booelean Indicates whether or not the directions request comes from a device with a location sensor - * @return array - */ - public function getResponse($origin, $destination, $sensor = 'false') { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string', 'int', 'float') //argument 1 must be a string, integer or float - ->argument(2, 'string', 'int', 'float') //argument 2 must be a string, integer or float - ->argument(3, 'string'); //argument 3 must be a string - - //populate paramenter - $query = array( - 'origin' => $origin, - 'sensor' => $sensor, - 'destination' => $destination, - 'alternatives' => $this->_alternatives, //optional - 'region' => $this->_region, //optional - 'departureTime' => $this->_departureTime, //optional - 'arrivalTime' => $this->_arrivalTime, //optional - 'language' => $this->_language, //optional - 'avoid' => $this->_avoid, //optional - 'units' => $this->_units); //optional - - - return $this->_getResponse(self::URL_MAP_DIRECTION, $query); - } - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google Map Direction Class + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Maps_Direction extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_MAP_DIRECTION = 'http://maps.googleapis.com/maps/api/directions/json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_apiKey = NULL; + protected $_samples = NULL; + protected $_mode = NULL; + protected $_language = NULL; + protected $_avoid = NULL; + protected $_units = NULL; + protected $_waypoints = NULL; + protected $_alternatives = NULL; + protected $_departureTime = NULL; + protected $_arrivalTime = NULL; + protected $_region = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Set Distance to avoid highways + * + * @return this + */ + public function avoidHighways() { + $this->_avoid = 'highways'; + return $this; + } + + /** + * Set Distance to avoid tolls + * + * @return this + */ + public function avoidTolls() { + $this->_avoid = 'tolls'; + return $this; + } + + /** + * Specifies the mode of transport to use when + * calculating directions is bicycling. + * + * @return this + */ + public function bicycling() { + $this->_mode = 'bicycling'; + return $this; + } + + /** + * Specifies the mode of transport to use when + * calculating directions is driving. + * + * @return this + */ + public function driving() { + $this->_mode = 'driving'; + return $this; + } + + /** + * Requests directions via public transit + * routes. Both arrivalTime and departureTime are + * only valid when mode is set to "transit". + * + * @return this + */ + public function transit() { + $this->_mode = 'transit'; + return $this; + } + + /** + * Specifies the mode of transport to use when + * calculating directions is walking. + * + * @return this + */ + public function walking() { + $this->_mode = 'walking'; + return $this; + } + + /** + * The language in which to return results. + * + * @param string|integer + * @return this + */ + public function setLanguage($language) { + //argument 1 must be a string or integer + Eden_Google_Error::i()->argument(1, 'string', 'int'); + + $this->_language = $language; + + return $this; + } + + /** + * Waypoints alter a route by routing it through the specified location(s) + * + * @param string|integer + * @return this + */ + public function setWaypoints($waypoint) { + //argument 1 must be a string or integer + Eden_Google_Error::i()->argument(1, 'string', 'int'); + + $this->_waypoint = $waypoint; + + return $this; + } + + /** + * The region code + * + * @param string|integer + * @return this + */ + public function setRegion($region) { + //argument 1 must be a string or integer + Eden_Google_Error::i()->argument(1, 'string', 'int'); + + $this->_region = $region; + + return $this; + } + + /** + * Returns distances in miles and feet. + * + * @return this + */ + public function setUnitToImperial() { + $this->_units = 'imperial'; + return $this; + } + + /** + * Specifies that the Directions service may + * provide more than one route alternative in the response. + * + * @return this + */ + public function setAlternatives() { + $this->_alternatives = 'true'; + return $this; + } + + /** + * Specifies the desired time of departure for transit directions as seconds + * -timespamp + * + * @param string|int + * @return this + */ + public function setDepartureTime($departureTime) { + //argument 1 must be a string or integer + Eden_Google_Error::i()->argument(1, 'string', 'int'); + + if(is_string($departureTime)) { + $departureTime = strtotime($departureTime); + } + + $this->_departureTime = $departureTime; + + return $this; + } + + /** + * specifies the desired time of arrival for transit directions as seconds + * -timespamp + * + * @param string|int + * @return this + */ + public function setArrivalTime($arrivalTime) { + //argument 1 must be a string or integer + Eden_Google_Error::i()->argument(1, 'string', 'int'); + + if(is_string($arrivalTime)) { + $arrivalTime = strtotime($arrivalTime); + } + + $this->_arrivalTime = $arrivalTime; + + return $this; + } + + /** + * Returns calculated directions between locations + * + * @param string|integer|float The address or textual latitude/longitude value from which you wish to calculate directions + * @param string|integer|float The address or textual latitude/longitude value from which you wish to calculate directions + * @param booelean Indicates whether or not the directions request comes from a device with a location sensor + * @return array + */ + public function getResponse($origin, $destination, $sensor = 'false') { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string', 'int', 'float') //argument 1 must be a string, integer or float + ->argument(2, 'string', 'int', 'float') //argument 2 must be a string, integer or float + ->argument(3, 'string'); //argument 3 must be a string + + //populate paramenter + $query = array( + 'origin' => $origin, + 'sensor' => $sensor, + 'destination' => $destination, + 'alternatives' => $this->_alternatives, //optional + 'region' => $this->_region, //optional + 'departureTime' => $this->_departureTime, //optional + 'arrivalTime' => $this->_arrivalTime, //optional + 'language' => $this->_language, //optional + 'avoid' => $this->_avoid, //optional + 'units' => $this->_units); //optional + + + return $this->_getResponse(self::URL_MAP_DIRECTION, $query); + } + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/maps/distance.php b/library/eden/google/maps/distance.php index 23d8374..7d74659 100644 --- a/library/eden/google/maps/distance.php +++ b/library/eden/google/maps/distance.php @@ -1,152 +1,152 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google Map distance Class - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Maps_Distance extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_MAP_DISTANCE = 'http://maps.googleapis.com/maps/api/distancematrix/json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_apiKey = NULL; - protected $_mode = NULL; - protected $_language = NULL; - protected $_avoid = NULL; - protected $_units = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Set Distance to avoid highways - * - * @return this - */ - public function avoidHighways() { - $this->_avoid = 'highways'; - return $this; - } - - /** - * Set Distance to avoid tolls - * - * @return this - */ - public function avoidTolls() { - $this->_avoid = 'tolls'; - return $this; - } - - /** - * Specifies the mode of transport to use when - * calculating directions is bicycling. - * - * @return this - */ - public function bicycling() { - $this->_mode = 'bicycling'; - return $this; - } - - /** - * Specifies the mode of transport to use when - * calculating directions is driving. - * - * @return this - */ - public function driving() { - $this->_mode = 'driving'; - return $this; - } - - /** - * Specifies the mode of transport to use when - * calculating directions is walking. - * - * @return this - */ - public function walking() { - $this->_mode = 'walking'; - return $this; - } - - /** - * The language in which to return results. - * - * @param string|integer - * @return this - */ - public function setLanguage($language) { - //argument 1 must be a string or integer - Eden_Google_Error::i()->argument(1, 'string', 'int'); - - $this->_language = $language; - - return $this; - } - - /** - * Returns distances in miles and feet. - * - * @return this - */ - public function setUnitToImperial() { - $this->_units = 'imperial'; - - return $this; - } - - /** - * Returns travel distance and time for a matrix of origins and destinations - * - * @param string|integer|float - * @param string|integer|float - * @param string - * @return array - */ - public function getResponse($origin, $destination, $sensor = 'false') { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string', 'int', 'float') //argument 1 must be a string, integer or float - ->argument(2, 'string', 'int', 'float') //argument 2 must be a string, integer or float - ->argument(3, 'string'); //argument 3 must be a string - - //populate paramenter - $query = array( - 'origins' => $origin, - 'sensor' => $sensor, - 'destinations' => $destination, - 'language' => $this->_language, //optional - 'avoid' => $this->_avoid, //optional - 'mode' => $this->_mode, //optional - 'units' => $this->_units); //optional - - return $this->_getResponse(self::URL_MAP_DISTANCE, $query); - } - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google Map distance Class + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Maps_Distance extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_MAP_DISTANCE = 'http://maps.googleapis.com/maps/api/distancematrix/json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_apiKey = NULL; + protected $_mode = NULL; + protected $_language = NULL; + protected $_avoid = NULL; + protected $_units = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Set Distance to avoid highways + * + * @return this + */ + public function avoidHighways() { + $this->_avoid = 'highways'; + return $this; + } + + /** + * Set Distance to avoid tolls + * + * @return this + */ + public function avoidTolls() { + $this->_avoid = 'tolls'; + return $this; + } + + /** + * Specifies the mode of transport to use when + * calculating directions is bicycling. + * + * @return this + */ + public function bicycling() { + $this->_mode = 'bicycling'; + return $this; + } + + /** + * Specifies the mode of transport to use when + * calculating directions is driving. + * + * @return this + */ + public function driving() { + $this->_mode = 'driving'; + return $this; + } + + /** + * Specifies the mode of transport to use when + * calculating directions is walking. + * + * @return this + */ + public function walking() { + $this->_mode = 'walking'; + return $this; + } + + /** + * The language in which to return results. + * + * @param string|integer + * @return this + */ + public function setLanguage($language) { + //argument 1 must be a string or integer + Eden_Google_Error::i()->argument(1, 'string', 'int'); + + $this->_language = $language; + + return $this; + } + + /** + * Returns distances in miles and feet. + * + * @return this + */ + public function setUnitToImperial() { + $this->_units = 'imperial'; + + return $this; + } + + /** + * Returns travel distance and time for a matrix of origins and destinations + * + * @param string|integer|float + * @param string|integer|float + * @param string + * @return array + */ + public function getResponse($origin, $destination, $sensor = 'false') { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string', 'int', 'float') //argument 1 must be a string, integer or float + ->argument(2, 'string', 'int', 'float') //argument 2 must be a string, integer or float + ->argument(3, 'string'); //argument 3 must be a string + + //populate paramenter + $query = array( + 'origins' => $origin, + 'sensor' => $sensor, + 'destinations' => $destination, + 'language' => $this->_language, //optional + 'avoid' => $this->_avoid, //optional + 'mode' => $this->_mode, //optional + 'units' => $this->_units); //optional + + return $this->_getResponse(self::URL_MAP_DISTANCE, $query); + } + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/maps/elevation.php b/library/eden/google/maps/elevation.php index 2cf722a..6b47936 100644 --- a/library/eden/google/maps/elevation.php +++ b/library/eden/google/maps/elevation.php @@ -1,99 +1,99 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google Map Static Class - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Maps_Elevation extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_MAP_ELEVATION = 'http://maps.googleapis.com/maps/api/elevation/json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_apiKey = NULL; - protected $_path = NULL; - protected $_samples = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Defines a path on the earth for which to return elevation data. - * - * @param string|int|float - * @param string|int|float - * @return this - */ - public function setPath($latitude, $longtitude) { - //argument testing - Eden_Google_Error::i() - ->argument(1, 'string', 'int', 'float') //argument 1 must be a string, integer or float - ->argument(2, 'string', 'int', 'float'); //argument 2 must be a string, integer or float - - $this->_path = $latitude.', '.$longtitude; - - return $this; - } - - /** - * Specifies the number of sample points along a - * path for which to return elevation data. - * - * @param string|integer - * @return this - */ - public function setSamples($samples) { - //argument 1 must be a string or integer - Eden_Google_Error::i()->argument(1, 'string', 'int'); - - $this->_samples = $samples; - - return $this; - } - - /** - * Returns elevation information - * - * @param string latitude,longitude pair in string(e.g. "40.714728,-73.998672") - * @return array - */ - public function getResponse($location, $sensor = 'false') { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string'); //argument 2 must be a string - - //populate paramenter - $query = array( - 'locations' => $ocation, - 'sensor' => $sensor, - 'path' => $this->_path, //optional - 'samples' => $this->_samples); //optional - - return $this->_getResponse(self::URL_MAP_ELEVATION, $query); - } - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google Map Static Class + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Maps_Elevation extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_MAP_ELEVATION = 'http://maps.googleapis.com/maps/api/elevation/json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_apiKey = NULL; + protected $_path = NULL; + protected $_samples = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Defines a path on the earth for which to return elevation data. + * + * @param string|int|float + * @param string|int|float + * @return this + */ + public function setPath($latitude, $longtitude) { + //argument testing + Eden_Google_Error::i() + ->argument(1, 'string', 'int', 'float') //argument 1 must be a string, integer or float + ->argument(2, 'string', 'int', 'float'); //argument 2 must be a string, integer or float + + $this->_path = $latitude.', '.$longtitude; + + return $this; + } + + /** + * Specifies the number of sample points along a + * path for which to return elevation data. + * + * @param string|integer + * @return this + */ + public function setSamples($samples) { + //argument 1 must be a string or integer + Eden_Google_Error::i()->argument(1, 'string', 'int'); + + $this->_samples = $samples; + + return $this; + } + + /** + * Returns elevation information + * + * @param string latitude,longitude pair in string(e.g. "40.714728,-73.998672") + * @return array + */ + public function getResponse($location, $sensor = 'false') { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string'); //argument 2 must be a string + + //populate paramenter + $query = array( + 'locations' => $ocation, + 'sensor' => $sensor, + 'path' => $this->_path, //optional + 'samples' => $this->_samples); //optional + + return $this->_getResponse(self::URL_MAP_ELEVATION, $query); + } + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/maps/geocoding.php b/library/eden/google/maps/geocoding.php index 7be2a16..1303d0b 100644 --- a/library/eden/google/maps/geocoding.php +++ b/library/eden/google/maps/geocoding.php @@ -1,132 +1,132 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google Map geocoding Class - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Maps_Geocoding extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_MAP_GEOCODING = 'http://maps.googleapis.com/maps/api/geocode/json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_apiKey = NULL; - protected $_latlng = NULL; - protected $_bounds = NULL; - protected $_language = NULL; - protected $_region = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * The textual latitude/longitude value for which you wish to obtain the closest. - * - * @param string|int|float - * @param string|int|float - * @return this - */ - public function setLocation($latitude, $longtitude) { - //argument testing - Eden_Google_Error::i() - ->argument(1, 'string', 'int', 'float') //argument 1 must be a string, integer or float - ->argument(2, 'string', 'int', 'float'); //argument 2 must be a string, integer or float - - $this->_latlng = $latitude.','.$longtitude; - - return $this; - } - - /** - * The bounding box of the viewport within which to bias geocode results more prominently. - * - * @param string - * @return this - */ - public function setBounds($bounds) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - $this->_bounds = $bounds; - - return $this; - } - - /** - * The language in which to return results. - * - * @param string - * @return this - */ - public function setLanguage($language) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - $this->_language = $language; - - return $this; - } - - /** - * The region code - * - * @param string - * @return this - */ - public function setRegion($region) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - $this->_region = $region; - - return $this; - } - - /** - * Returns geocode information - * - * @param string - * @param string - * @return array - */ - public function getResponse($address, $sensor = 'false') { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string'); //argument 2 must be a string - - //populate paramenter - $query = array( - 'address' => $address, - 'sensor' => $sensor, - 'bounds' => $this->_bounds, //optional - 'language' => $this->_language, //optional - 'region' => $this->_region); //optional - - return $this->_getResponse(self::URL_MAP_GEOCODING, $query); - } - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google Map geocoding Class + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Maps_Geocoding extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_MAP_GEOCODING = 'http://maps.googleapis.com/maps/api/geocode/json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_apiKey = NULL; + protected $_latlng = NULL; + protected $_bounds = NULL; + protected $_language = NULL; + protected $_region = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * The textual latitude/longitude value for which you wish to obtain the closest. + * + * @param string|int|float + * @param string|int|float + * @return this + */ + public function setLocation($latitude, $longtitude) { + //argument testing + Eden_Google_Error::i() + ->argument(1, 'string', 'int', 'float') //argument 1 must be a string, integer or float + ->argument(2, 'string', 'int', 'float'); //argument 2 must be a string, integer or float + + $this->_latlng = $latitude.','.$longtitude; + + return $this; + } + + /** + * The bounding box of the viewport within which to bias geocode results more prominently. + * + * @param string + * @return this + */ + public function setBounds($bounds) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + $this->_bounds = $bounds; + + return $this; + } + + /** + * The language in which to return results. + * + * @param string + * @return this + */ + public function setLanguage($language) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + $this->_language = $language; + + return $this; + } + + /** + * The region code + * + * @param string + * @return this + */ + public function setRegion($region) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + $this->_region = $region; + + return $this; + } + + /** + * Returns geocode information + * + * @param string + * @param string + * @return array + */ + public function getResponse($address, $sensor = 'false') { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string'); //argument 2 must be a string + + //populate paramenter + $query = array( + 'address' => $address, + 'sensor' => $sensor, + 'bounds' => $this->_bounds, //optional + 'language' => $this->_language, //optional + 'region' => $this->_region); //optional + + return $this->_getResponse(self::URL_MAP_GEOCODING, $query); + } + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/maps/image.php b/library/eden/google/maps/image.php index 8b6e033..8122860 100644 --- a/library/eden/google/maps/image.php +++ b/library/eden/google/maps/image.php @@ -1,350 +1,350 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google Map Static Class - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Maps_Image extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_MAP_IMAGE_STATIC = 'http://maps.googleapis.com/maps/api/staticmap'; - const URL_MAP_IMAGE_STREET = 'http://maps.googleapis.com/maps/api/streetview'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_apiKey = NULL; - protected $_scale = NULL; - protected $_format = NULL; - protected $_maptype = NULL; - protected $_language = NULL; - protected $_region = NULL; - protected $_markers = NULL; - protected $_path = NULL; - protected $_visible = NULL; - protected $_style = NULL; - protected $_heading = NULL; - protected $_fov = NULL; - protected $_pitch = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($apiKey) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - $this->_apiKey = $apiKey; - } - - /* Public Methods - -------------------------------*/ - /** - * Affects the number of pixels that are returned. - * - * @param integer - * @return this - */ - public function setScale($scale) { - //argument 1 must be a integer - Eden_Google_Error::i()->argument(1, 'int'); - - $this->_scale = $scale; - - return $this; - } - - /** - * Defines the format of the resulting image. - * By default, the Static Maps API creates PNG images. - * - * @param string - * @return this - */ - public function setFormat($format) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - $this->_format = $format; - - return $this; - } - - /** - * Defines the language to use for display of labels on map tiles - * - * @param string - * @return this - */ - public function setLanguage($language) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - $this->_language = $language; - - return $this; - } - - /** - * Defines the appropriate borders to display, - * based on geo-political sensitivities. - * - * @param string - * @return this - */ - public function setRegion($region) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - $this->_region = $region; - - return $this; - } - - /** - * Define one or more markers to attach to the image at - * specified locations. - * - * @param string - * @return this - */ - public function setMarkers($markers) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - $this->_markers = $markers; - - return $this; - } - - /** - * Defines a single path of two or more connected points - * to overlay on the image at specified locations. - * - * @param string - * @return this - */ - public function setPath($path) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - $this->_path = $path; - - return $this; - } - - /** - * Specifies one or more locations that should remain - * visible on the map, though no markers or other - * indicators will be displayed. - * - * @param string - * @return this - */ - public function setVisible($visible) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - $this->_visible = $visible; - - return $this; - } - - /** - * Defines a custom style to alter the presentation of a - * specific feature (road, park, etc.) of the map. - * - * @param string - * @return this - */ - public function setStyle($style) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - $this->_style = $style; - - return $this; - } - - /** - * Indicates the compass heading of the camera. - * Accepted values are from 0 to 360 (both values - * indicating North, with 90 indicating East, and 180 South). - * - * @param integer - * @return this - */ - public function setHeading($heading) { - //argument 1 must be a integer - Eden_Google_Error::i()->argument(1, 'int'); - - $this->_heading = $heading; - - return $this; - } - - /** - * Determines the horizontal field of view of the image. - * The field of view is expressed in degrees, with a - * maximum allowed value of 120. - * - * @param integer - * @return this - */ - public function setFov($fov) { - //argument 1 must be a integer - Eden_Google_Error::i()->argument(1, 'int'); - - $this->_fov = $fov; - - return $this; - } - - /** - * specifies the up or down angle of the camera relative - * to the Street View vehicle. - * - * @param integer - * @return this - */ - public function setPitch($pitch) { - //argument 1 must be a integer - Eden_Google_Error::i()->argument(1, 'int'); - - $this->_pitch = $pitch; - - return $this; - } - - /** - * Specifies a standard roadmap image, as is normally - * shown on the Google Maps website. If no maptype - * value is specified, the Static Maps API serves - * roadmap tiles by default. - * - * @return this - */ - public function useRoadMap() { - $this->_maptype = 'roadmap'; - - return $this; - } - - /** - * Specifies a satellite image - * - * @return this - */ - public function useSatelliteMap() { - $this->_maptype = 'satellite'; - - return $this; - } - - /** - * Specifies a physical relief map image, - * showing terrain and vegetation. - * - * @return this - */ - public function useTerrainMap() { - $this->_maptype = 'terrain'; - - return $this; - } - - /** - * Specifies a hybrid of the satellite and - * roadmap image, showing a transparent layer - * of major streets and place names on the satellite image. - * - * @return this - */ - public function useHybridMap() { - $this->_maptype = 'hybrid'; - - return $this; - } - - /** - * Return url of the image map - * - * @param string Defines the center of the map, latitude,longitude pai or address pair - * @param string Defines the zoom level of the map, which determines the magnification level of the map - * @param string This parameter takes a string of the form {horizontal_value}x{vertical_value} - * @param string - * @return url - */ - public function getStaticMap($center, $zoom, $size, $sensor = 'false') { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string') //argument 2 must be a string - ->argument(3, 'string') //argument 3 must be a string - ->argument(4, 'string'); //argument 4 must be a string - - //populate fields - $query = array( - 'center' => $center, - 'zoom' => $zoom, - 'size' => $size, - 'sensor' => $sensor, - 'scale' => $this->_scale, //optional - 'format' => $this->_format, //optional - 'maptype' => $this->_maptype, //optional - 'language' => $this->_language, //optional - 'region' => $this->_region, //optional - 'markers' => $this->_markers, //optional - 'path' => $this->_path, //optional - 'visible' => $this->_visible, //optional - 'style' => $this->_style); //optional - - return $this->_getResponse(self::URL_MAP_IMAGE_STATIC, $query); - } - - /** - * Return url of the street map - * - * @param string Latitude,longitude pai or address pair - * @param string Size is specified as {width}x{height} - * @param string - * @return url - */ - public function getStreetMap($location, $size, $sensor = 'false') { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string') //argument 2 must be a string - ->argument(3, 'string'); //argument 3 must be a string - - //populate paramenter - $query = array( - 'size' => $size, - 'location' => $location, - 'sensor' => $sensor, - 'heading' => $this->_heading, //optional - 'fov' => $this->_fov, //optional - 'pitch' => $this->_pitch); //optional - - return $this->_getResponse(self::URL_MAP_IMAGE_STREET, $query); - } - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google Map Static Class + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Maps_Image extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_MAP_IMAGE_STATIC = 'http://maps.googleapis.com/maps/api/staticmap'; + const URL_MAP_IMAGE_STREET = 'http://maps.googleapis.com/maps/api/streetview'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_apiKey = NULL; + protected $_scale = NULL; + protected $_format = NULL; + protected $_maptype = NULL; + protected $_language = NULL; + protected $_region = NULL; + protected $_markers = NULL; + protected $_path = NULL; + protected $_visible = NULL; + protected $_style = NULL; + protected $_heading = NULL; + protected $_fov = NULL; + protected $_pitch = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($apiKey) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + $this->_apiKey = $apiKey; + } + + /* Public Methods + -------------------------------*/ + /** + * Affects the number of pixels that are returned. + * + * @param integer + * @return this + */ + public function setScale($scale) { + //argument 1 must be a integer + Eden_Google_Error::i()->argument(1, 'int'); + + $this->_scale = $scale; + + return $this; + } + + /** + * Defines the format of the resulting image. + * By default, the Static Maps API creates PNG images. + * + * @param string + * @return this + */ + public function setFormat($format) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + $this->_format = $format; + + return $this; + } + + /** + * Defines the language to use for display of labels on map tiles + * + * @param string + * @return this + */ + public function setLanguage($language) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + $this->_language = $language; + + return $this; + } + + /** + * Defines the appropriate borders to display, + * based on geo-political sensitivities. + * + * @param string + * @return this + */ + public function setRegion($region) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + $this->_region = $region; + + return $this; + } + + /** + * Define one or more markers to attach to the image at + * specified locations. + * + * @param string + * @return this + */ + public function setMarkers($markers) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + $this->_markers = $markers; + + return $this; + } + + /** + * Defines a single path of two or more connected points + * to overlay on the image at specified locations. + * + * @param string + * @return this + */ + public function setPath($path) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + $this->_path = $path; + + return $this; + } + + /** + * Specifies one or more locations that should remain + * visible on the map, though no markers or other + * indicators will be displayed. + * + * @param string + * @return this + */ + public function setVisible($visible) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + $this->_visible = $visible; + + return $this; + } + + /** + * Defines a custom style to alter the presentation of a + * specific feature (road, park, etc.) of the map. + * + * @param string + * @return this + */ + public function setStyle($style) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + $this->_style = $style; + + return $this; + } + + /** + * Indicates the compass heading of the camera. + * Accepted values are from 0 to 360 (both values + * indicating North, with 90 indicating East, and 180 South). + * + * @param integer + * @return this + */ + public function setHeading($heading) { + //argument 1 must be a integer + Eden_Google_Error::i()->argument(1, 'int'); + + $this->_heading = $heading; + + return $this; + } + + /** + * Determines the horizontal field of view of the image. + * The field of view is expressed in degrees, with a + * maximum allowed value of 120. + * + * @param integer + * @return this + */ + public function setFov($fov) { + //argument 1 must be a integer + Eden_Google_Error::i()->argument(1, 'int'); + + $this->_fov = $fov; + + return $this; + } + + /** + * specifies the up or down angle of the camera relative + * to the Street View vehicle. + * + * @param integer + * @return this + */ + public function setPitch($pitch) { + //argument 1 must be a integer + Eden_Google_Error::i()->argument(1, 'int'); + + $this->_pitch = $pitch; + + return $this; + } + + /** + * Specifies a standard roadmap image, as is normally + * shown on the Google Maps website. If no maptype + * value is specified, the Static Maps API serves + * roadmap tiles by default. + * + * @return this + */ + public function useRoadMap() { + $this->_maptype = 'roadmap'; + + return $this; + } + + /** + * Specifies a satellite image + * + * @return this + */ + public function useSatelliteMap() { + $this->_maptype = 'satellite'; + + return $this; + } + + /** + * Specifies a physical relief map image, + * showing terrain and vegetation. + * + * @return this + */ + public function useTerrainMap() { + $this->_maptype = 'terrain'; + + return $this; + } + + /** + * Specifies a hybrid of the satellite and + * roadmap image, showing a transparent layer + * of major streets and place names on the satellite image. + * + * @return this + */ + public function useHybridMap() { + $this->_maptype = 'hybrid'; + + return $this; + } + + /** + * Return url of the image map + * + * @param string Defines the center of the map, latitude,longitude pai or address pair + * @param string Defines the zoom level of the map, which determines the magnification level of the map + * @param string This parameter takes a string of the form {horizontal_value}x{vertical_value} + * @param string + * @return url + */ + public function getStaticMap($center, $zoom, $size, $sensor = 'false') { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string') //argument 2 must be a string + ->argument(3, 'string') //argument 3 must be a string + ->argument(4, 'string'); //argument 4 must be a string + + //populate fields + $query = array( + 'center' => $center, + 'zoom' => $zoom, + 'size' => $size, + 'sensor' => $sensor, + 'scale' => $this->_scale, //optional + 'format' => $this->_format, //optional + 'maptype' => $this->_maptype, //optional + 'language' => $this->_language, //optional + 'region' => $this->_region, //optional + 'markers' => $this->_markers, //optional + 'path' => $this->_path, //optional + 'visible' => $this->_visible, //optional + 'style' => $this->_style); //optional + + return $this->_getResponse(self::URL_MAP_IMAGE_STATIC, $query); + } + + /** + * Return url of the street map + * + * @param string Latitude,longitude pai or address pair + * @param string Size is specified as {width}x{height} + * @param string + * @return url + */ + public function getStreetMap($location, $size, $sensor = 'false') { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string') //argument 2 must be a string + ->argument(3, 'string'); //argument 3 must be a string + + //populate paramenter + $query = array( + 'size' => $size, + 'location' => $location, + 'sensor' => $sensor, + 'heading' => $this->_heading, //optional + 'fov' => $this->_fov, //optional + 'pitch' => $this->_pitch); //optional + + return $this->_getResponse(self::URL_MAP_IMAGE_STREET, $query); + } + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/oauth.php b/library/eden/google/oauth.php index 1214499..cfa2ab1 100644 --- a/library/eden/google/oauth.php +++ b/library/eden/google/oauth.php @@ -1,146 +1,146 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google oauth - * - * @package Eden - * @category google - * @author Christian Blanquera cblanquera@openovate.com - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Oauth extends Eden_Oauth2_Client { - /* Constants - -------------------------------*/ - const REQUEST_URL = 'https://accounts.google.com/o/oauth2/auth'; - const ACCESS_URL = 'https://accounts.google.com/o/oauth2/token'; - - const SCOPE_ANALYTICS = 'https://www.googleapis.com/auth/analytics.readonly'; - const SCOPE_BASE = 'https://www.google.com/base/feeds/'; - const SCOPE_BUZZ = 'https://www.googleapis.com/auth/buzz'; - const SCOPE_BOOK = 'https://www.google.com/books/feeds/'; - const SCOPE_BLOGGER = 'https://www.blogger.com/feeds/'; - const SCOPE_CALENDAR = 'https://www.google.com/calendar/feeds/'; - const SCOPE_CONTACTS = 'https://www.google.com/m8/feeds/'; - const SCOPE_CHROME = 'https://www.googleapis.com/auth/chromewebstore.readonly'; - const SCOPE_DOCUMENTS = 'https://docs.google.com/feeds/'; - const SCOPE_DRIVE = 'https://www.googleapis.com/auth/drive'; - const SCOPE_FINANCE = 'https://finance.google.com/finance/feeds/'; - const SCOPE_GMAIL = 'https://mail.google.com/mail/feed/atom'; - const SCOPE_HEALTH = 'https://www.google.com/health/feeds/'; - const SCOPE_H9 = 'https://www.google.com/h9/feeds/'; - const SCOPE_MAPS = 'https://maps.google.com/maps/feeds/'; - const SCOPE_MODERATOR = 'https://www.googleapis.com/auth/moderator'; - const SCOPE_OPENSOCIAL = 'https://www-opensocial.googleusercontent.com/api/people/'; - const SCOPE_ORKUT = 'https://www.googleapis.com/auth/orkut'; - const SCOPE_PLUS = 'https://www.googleapis.com/auth/plus.me'; - const SCOPE_PICASA = 'https://picasaweb.google.com/data/'; - const SCOPE_SIDEWIKI = 'https://www.google.com/sidewiki/feeds/'; - const SCOPE_SITES = 'https://sites.google.com/feeds/'; - const SCOPE_SREADSHEETS = 'https://spreadsheets.google.com/feeds/'; - const SCOPE_TASKS = 'https://www.googleapis.com/auth/tasks'; - const SCOPE_SHORTENER = 'https://www.googleapis.com/auth/urlshortener'; - const SCOPE_WAVE = 'http://wave.googleusercontent.com/api/rpc'; - const SCOPE_WEBMASTER = 'https://www.google.com/webmasters/tools/feeds/'; - const SCOPE_YOUTUBE = 'https://gdata.youtube.com'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_apiKey = NULL; - protected $_scopes = array( - 'analytics' => self::SCOPE_ANALYTICS, - 'base' => self::SCOPE_BASE, - 'buzz' => self::SCOPE_BUZZ, - 'book' => self::SCOPE_BOOK, - 'blogger' => self::SCOPE_BLOGGER, - 'calendar' => self::SCOPE_CALENDAR, - 'contacts' => self::SCOPE_CONTACTS, - 'chrome' => self::SCOPE_CHROME, - 'documents' => self::SCOPE_DOCUMENTS, - 'drive' => self::SCOPE_DRIVE, - 'finance' => self::SCOPE_FINANCE, - 'gmail' => self::SCOPE_GMAIL, - 'health' => self::SCOPE_HEALTH, - 'h9' => self::SCOPE_H9, - 'maps' => self::SCOPE_MAPS, - 'moderator' => self::SCOPE_MODERATOR, - 'opensocial' => self::SCOPE_OPENSOCIAL, - 'orkut' => self::SCOPE_ORKUT, - 'plus' => self::SCOPE_PLUS, - 'picasa' => self::SCOPE_PICASA, - 'sidewiki' => self::SCOPE_SIDEWIKI, - 'sites' => self::SCOPE_SITES, - 'spreadsheets' => self::SCOPE_SREADSHEETS, - 'tasks' => self::SCOPE_TASKS, - 'shortener' => self::SCOPE_SHORTENER, - 'wave' => self::SCOPE_WAVE, - 'webmaster' => self::SCOPE_WEBMASTER, - 'youtube' => self::SCOPE_YOUTUBE); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($clientId, $clientSecret, $redirect, $apiKey = NULL) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string', 'null'); //Argument 4 must be a string or null - - $this->_apiKey = $apiKey; - - parent::__construct($clientId, $clientSecret, $redirect, self::REQUEST_URL, self::ACCESS_URL); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns website login url - * - * @param string|null - * @param string|null - * @return url - */ - public function getLoginUrl($scope = NULL, $display = NULL) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string', 'array', 'null') //argument 1 must be a string, array or null - ->argument(2, 'string', 'array', 'null'); //argument 2 must be a string, array or null - - //if scope is a key in the scopes array - if(is_string($scope) && isset($this->_scopes[$scope])) { - $scope = $this->_scopes[$scope]; - //if it's an array - } else if(is_array($scope)) { - //loop through it - foreach($scope as $i => $key) { - //if this is a scope key - if(is_string($key) && isset($this->_scopes[$key])) { - //change it - $scope[$i] = $this->_scopes[$key]; - } - } - } - - return parent::getLoginUrl($scope, $display); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google oauth + * + * @package Eden + * @category google + * @author Christian Blanquera cblanquera@openovate.com + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Oauth extends Eden_Oauth2_Client { + /* Constants + -------------------------------*/ + const REQUEST_URL = 'https://accounts.google.com/o/oauth2/auth'; + const ACCESS_URL = 'https://accounts.google.com/o/oauth2/token'; + + const SCOPE_ANALYTICS = 'https://www.googleapis.com/auth/analytics.readonly'; + const SCOPE_BASE = 'https://www.google.com/base/feeds/'; + const SCOPE_BUZZ = 'https://www.googleapis.com/auth/buzz'; + const SCOPE_BOOK = 'https://www.google.com/books/feeds/'; + const SCOPE_BLOGGER = 'https://www.blogger.com/feeds/'; + const SCOPE_CALENDAR = 'https://www.google.com/calendar/feeds/'; + const SCOPE_CONTACTS = 'https://www.google.com/m8/feeds/'; + const SCOPE_CHROME = 'https://www.googleapis.com/auth/chromewebstore.readonly'; + const SCOPE_DOCUMENTS = 'https://docs.google.com/feeds/'; + const SCOPE_DRIVE = 'https://www.googleapis.com/auth/drive'; + const SCOPE_FINANCE = 'https://finance.google.com/finance/feeds/'; + const SCOPE_GMAIL = 'https://mail.google.com/mail/feed/atom'; + const SCOPE_HEALTH = 'https://www.google.com/health/feeds/'; + const SCOPE_H9 = 'https://www.google.com/h9/feeds/'; + const SCOPE_MAPS = 'https://maps.google.com/maps/feeds/'; + const SCOPE_MODERATOR = 'https://www.googleapis.com/auth/moderator'; + const SCOPE_OPENSOCIAL = 'https://www-opensocial.googleusercontent.com/api/people/'; + const SCOPE_ORKUT = 'https://www.googleapis.com/auth/orkut'; + const SCOPE_PLUS = 'https://www.googleapis.com/auth/plus.me'; + const SCOPE_PICASA = 'https://picasaweb.google.com/data/'; + const SCOPE_SIDEWIKI = 'https://www.google.com/sidewiki/feeds/'; + const SCOPE_SITES = 'https://sites.google.com/feeds/'; + const SCOPE_SREADSHEETS = 'https://spreadsheets.google.com/feeds/'; + const SCOPE_TASKS = 'https://www.googleapis.com/auth/tasks'; + const SCOPE_SHORTENER = 'https://www.googleapis.com/auth/urlshortener'; + const SCOPE_WAVE = 'http://wave.googleusercontent.com/api/rpc'; + const SCOPE_WEBMASTER = 'https://www.google.com/webmasters/tools/feeds/'; + const SCOPE_YOUTUBE = 'https://gdata.youtube.com'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_apiKey = NULL; + protected $_scopes = array( + 'analytics' => self::SCOPE_ANALYTICS, + 'base' => self::SCOPE_BASE, + 'buzz' => self::SCOPE_BUZZ, + 'book' => self::SCOPE_BOOK, + 'blogger' => self::SCOPE_BLOGGER, + 'calendar' => self::SCOPE_CALENDAR, + 'contacts' => self::SCOPE_CONTACTS, + 'chrome' => self::SCOPE_CHROME, + 'documents' => self::SCOPE_DOCUMENTS, + 'drive' => self::SCOPE_DRIVE, + 'finance' => self::SCOPE_FINANCE, + 'gmail' => self::SCOPE_GMAIL, + 'health' => self::SCOPE_HEALTH, + 'h9' => self::SCOPE_H9, + 'maps' => self::SCOPE_MAPS, + 'moderator' => self::SCOPE_MODERATOR, + 'opensocial' => self::SCOPE_OPENSOCIAL, + 'orkut' => self::SCOPE_ORKUT, + 'plus' => self::SCOPE_PLUS, + 'picasa' => self::SCOPE_PICASA, + 'sidewiki' => self::SCOPE_SIDEWIKI, + 'sites' => self::SCOPE_SITES, + 'spreadsheets' => self::SCOPE_SREADSHEETS, + 'tasks' => self::SCOPE_TASKS, + 'shortener' => self::SCOPE_SHORTENER, + 'wave' => self::SCOPE_WAVE, + 'webmaster' => self::SCOPE_WEBMASTER, + 'youtube' => self::SCOPE_YOUTUBE); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($clientId, $clientSecret, $redirect, $apiKey = NULL) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string', 'null'); //Argument 4 must be a string or null + + $this->_apiKey = $apiKey; + + parent::__construct($clientId, $clientSecret, $redirect, self::REQUEST_URL, self::ACCESS_URL); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns website login url + * + * @param string|null + * @param string|null + * @return url + */ + public function getLoginUrl($scope = NULL, $display = NULL) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string', 'array', 'null') //argument 1 must be a string, array or null + ->argument(2, 'string', 'array', 'null'); //argument 2 must be a string, array or null + + //if scope is a key in the scopes array + if(is_string($scope) && isset($this->_scopes[$scope])) { + $scope = $this->_scopes[$scope]; + //if it's an array + } else if(is_array($scope)) { + //loop through it + foreach($scope as $i => $key) { + //if this is a scope key + if(is_string($key) && isset($this->_scopes[$key])) { + //change it + $scope[$i] = $this->_scopes[$key]; + } + } + } + + return parent::getLoginUrl($scope, $display); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/youtube.php b/library/eden/google/youtube.php index 327f2f4..75f784c 100644 --- a/library/eden/google/youtube.php +++ b/library/eden/google/youtube.php @@ -1,173 +1,173 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google youtube - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Youtube extends Eden_Google_Base { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($token, $developerId) { - //argument test - Eden_Google_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $this->_token = $token; - $this->_developerId = $developerId; - } - - /* Public Methods - -------------------------------*/ - /** - * Factory method for youtube activity - * - * @return Eden_Google_Youtube_Activity - */ - public function activity() { - return Eden_Google_Youtube_Activity::i($this->_token, $this->_developerId); - } - - /** - * Factory method for youtube channel - * - * @return Eden_Google_Youtube_Channel - */ - public function channel() { - return Eden_Google_Youtube_Channel::i($this->_token); - } - - /** - * Factory method for youtube comment - * - * @return Eden_Google_Youtube_Activity - */ - public function comment() { - return Eden_Google_Youtube_Comment::i($this->_token, $this->_developerId); - } - - /** - * Factory method for youtube contacts - * - * @return Eden_Google_Youtube_Contacts - */ - public function contacts() { - return Eden_Google_Youtube_Contacts::i($this->_token, $this->_developerId); - } - - /** - * Factory method for youtube favorites - * - * @return Eden_Google_Youtube_Favorites - */ - public function favorites() { - return Eden_Google_Youtube_Favorites::i($this->_token, $this->_developerId); - } - - /** - * Factory method for youtube history - * - * @return Eden_Google_Youtube_History - */ - public function history() { - return Eden_Google_Youtube_History::i($this->_token, $this->_developerId); - } - - /** - * Factory method for youtube message - * - * @return Eden_Google_Youtube_Message - */ - public function message() { - return Eden_Google_Youtube_Message::i($this->_token, $this->_developerId); - } - - /** - * Factory method for youtube playlist - * - * @return Eden_Google_Youtube_Playlist - */ - public function playlist() { - return Eden_Google_Youtube_Playlist::i($this->_token, $this->_developerId); - } - - /** - * Factory method for youtube profile - * - * @return Eden_Google_Youtube_Profile - */ - public function profile() { - return Eden_Google_Youtube_Profile::i($this->_token, $this->_developerId); - } - - /** - * Factory method for youtube ratings - * - * @return Eden_Google_Youtube_Ratings - */ - public function ratings() { - return Eden_Google_Youtube_Ratings::i($this->_token, $this->_developerId); - } - - /** - * Factory method for youtube search - * - * @return Eden_Google_Youtube_Search - */ - public function search() { - return Eden_Google_Youtube_Search::i($this->_token); - } - - /** - * Factory method for youtube subscription - * - * @return Eden_Google_Youtube_Subscription - */ - public function subscription() { - return Eden_Google_Youtube_Subscription::i($this->_token, $this->_developerId); - } - - /** - * Factory method for youtube upload - * - * @return Eden_Google_Youtube_Upload - */ - public function upload() { - return Eden_Google_Youtube_Upload::i($this->_token, $this->_developerId); - } - - /** - * Factory method for youtube video - * - * @return Eden_Google_Youtube_Video - */ - public function video() { - return Eden_Google_Youtube_Video::i($this->_token); - } - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google youtube + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Youtube extends Eden_Google_Base { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($token, $developerId) { + //argument test + Eden_Google_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $this->_token = $token; + $this->_developerId = $developerId; + } + + /* Public Methods + -------------------------------*/ + /** + * Factory method for youtube activity + * + * @return Eden_Google_Youtube_Activity + */ + public function activity() { + return Eden_Google_Youtube_Activity::i($this->_token, $this->_developerId); + } + + /** + * Factory method for youtube channel + * + * @return Eden_Google_Youtube_Channel + */ + public function channel() { + return Eden_Google_Youtube_Channel::i($this->_token); + } + + /** + * Factory method for youtube comment + * + * @return Eden_Google_Youtube_Activity + */ + public function comment() { + return Eden_Google_Youtube_Comment::i($this->_token, $this->_developerId); + } + + /** + * Factory method for youtube contacts + * + * @return Eden_Google_Youtube_Contacts + */ + public function contacts() { + return Eden_Google_Youtube_Contacts::i($this->_token, $this->_developerId); + } + + /** + * Factory method for youtube favorites + * + * @return Eden_Google_Youtube_Favorites + */ + public function favorites() { + return Eden_Google_Youtube_Favorites::i($this->_token, $this->_developerId); + } + + /** + * Factory method for youtube history + * + * @return Eden_Google_Youtube_History + */ + public function history() { + return Eden_Google_Youtube_History::i($this->_token, $this->_developerId); + } + + /** + * Factory method for youtube message + * + * @return Eden_Google_Youtube_Message + */ + public function message() { + return Eden_Google_Youtube_Message::i($this->_token, $this->_developerId); + } + + /** + * Factory method for youtube playlist + * + * @return Eden_Google_Youtube_Playlist + */ + public function playlist() { + return Eden_Google_Youtube_Playlist::i($this->_token, $this->_developerId); + } + + /** + * Factory method for youtube profile + * + * @return Eden_Google_Youtube_Profile + */ + public function profile() { + return Eden_Google_Youtube_Profile::i($this->_token, $this->_developerId); + } + + /** + * Factory method for youtube ratings + * + * @return Eden_Google_Youtube_Ratings + */ + public function ratings() { + return Eden_Google_Youtube_Ratings::i($this->_token, $this->_developerId); + } + + /** + * Factory method for youtube search + * + * @return Eden_Google_Youtube_Search + */ + public function search() { + return Eden_Google_Youtube_Search::i($this->_token); + } + + /** + * Factory method for youtube subscription + * + * @return Eden_Google_Youtube_Subscription + */ + public function subscription() { + return Eden_Google_Youtube_Subscription::i($this->_token, $this->_developerId); + } + + /** + * Factory method for youtube upload + * + * @return Eden_Google_Youtube_Upload + */ + public function upload() { + return Eden_Google_Youtube_Upload::i($this->_token, $this->_developerId); + } + + /** + * Factory method for youtube video + * + * @return Eden_Google_Youtube_Video + */ + public function video() { + return Eden_Google_Youtube_Video::i($this->_token); + } + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/youtube/search.php b/library/eden/google/youtube/search.php index bb01322..6359dce 100644 --- a/library/eden/google/youtube/search.php +++ b/library/eden/google/youtube/search.php @@ -1,143 +1,143 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google youtube search - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Youtube_Search extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_YOUTUBE_SEARCH = 'https://gdata.youtube.com/feeds/api/videos'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_startIndex = NULL; - protected $_maxResults = NULL; - protected $_orderBy = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($token) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - $this->_token = $token; - } - - /* Public Methods - -------------------------------*/ - /** - * Set start index - * - * @param integer - * @return this - */ - public function setStart($start) { - //argument 1 must be a integer - Eden_Google_Error::i()->argument(1, 'integer'); - $this->_startIndex = $start; - - return $this; - } - - /** - * Set start index - * - * @param integer - * @return this - */ - public function setRange($range) { - //argument 1 must be a integer - Eden_Google_Error::i()->argument(1, 'integer'); - $this->_maxResults = $range; - - return $this; - } - - /** - * Order results by relevance - * - * @return this - */ - public function orderByRelevance() { - $this->_orderBy = 'relevance'; - - return $this; - } - - /** - * Order results by published - * - * @return this - */ - public function orderByPublished() { - $this->_orderBy = 'published'; - - return $this; - } - - /** - * Order results by viewCount - * - * @return this - */ - public function orderByViewCount() { - $this->_orderBy = 'viewCount'; - - return $this; - } - - /** - * Order results by rating - * - * @return this - */ - public function orderByRating() { - $this->_orderBy = 'rating'; - - return $this; - } - - /** - * Returns a collection of videos that match the API request parameters. - * - * @param string - * @return array - */ - public function getResponse($queryString) { - //argument 1 must be a string - Eden_Google_Error::i()->argument(1, 'string'); - - //populate parameters - $query = array( - self::QUERY => $queryString, - self::VERSION => self::VERSION_TWO, - self::START_INDEX => $this->_startIndex, //optional - self::MAX_RESULTS => $this->_maxResults, //optional - self::ORDER_BY => $this->_orderBy); //optional - - return $this->_getResponse(self::URL_YOUTUBE_SEARCH, $query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google youtube search + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Youtube_Search extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_YOUTUBE_SEARCH = 'https://gdata.youtube.com/feeds/api/videos'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_startIndex = NULL; + protected $_maxResults = NULL; + protected $_orderBy = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($token) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + $this->_token = $token; + } + + /* Public Methods + -------------------------------*/ + /** + * Set start index + * + * @param integer + * @return this + */ + public function setStart($start) { + //argument 1 must be a integer + Eden_Google_Error::i()->argument(1, 'integer'); + $this->_startIndex = $start; + + return $this; + } + + /** + * Set start index + * + * @param integer + * @return this + */ + public function setRange($range) { + //argument 1 must be a integer + Eden_Google_Error::i()->argument(1, 'integer'); + $this->_maxResults = $range; + + return $this; + } + + /** + * Order results by relevance + * + * @return this + */ + public function orderByRelevance() { + $this->_orderBy = 'relevance'; + + return $this; + } + + /** + * Order results by published + * + * @return this + */ + public function orderByPublished() { + $this->_orderBy = 'published'; + + return $this; + } + + /** + * Order results by viewCount + * + * @return this + */ + public function orderByViewCount() { + $this->_orderBy = 'viewCount'; + + return $this; + } + + /** + * Order results by rating + * + * @return this + */ + public function orderByRating() { + $this->_orderBy = 'rating'; + + return $this; + } + + /** + * Returns a collection of videos that match the API request parameters. + * + * @param string + * @return array + */ + public function getResponse($queryString) { + //argument 1 must be a string + Eden_Google_Error::i()->argument(1, 'string'); + + //populate parameters + $query = array( + self::QUERY => $queryString, + self::VERSION => self::VERSION_TWO, + self::START_INDEX => $this->_startIndex, //optional + self::MAX_RESULTS => $this->_maxResults, //optional + self::ORDER_BY => $this->_orderBy); //optional + + return $this->_getResponse(self::URL_YOUTUBE_SEARCH, $query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/google/youtube/video.php b/library/eden/google/youtube/video.php index 0c6f987..5d0eba5 100644 --- a/library/eden/google/youtube/video.php +++ b/library/eden/google/youtube/video.php @@ -1,211 +1,211 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Google youtube video - * - * @package Eden - * @category google - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Google_Youtube_Video extends Eden_Google_Base { - /* Constants - -------------------------------*/ - const URL_YOUTUBE_FEEDS = 'https://gdata.youtube.com/feeds/api/standardfeeds/%s'; - const URL_YOUTUBE_CATEGORY = 'https://gdata.youtube.com/feeds/api/videos'; - const URL_YOUTUBE_REGION = 'http://gdata.youtube.com/feeds/api/standardfeeds/%s/%s'; - const URL_YOUTUBE_FAVORITES = 'http://gdata.youtube.com/feeds/api/users/%s/favorites'; - const URL_YOUTUBE_GET = 'https://gdata.youtube.com/feeds/api/videos/%s'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_feeds = 'most_popular'; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($token) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - $this->_token = $token; - } - - /* Public Methods - -------------------------------*/ - /** - * Returns the most highly rated YouTube videos. - * - * @return this - */ - public function filterByTopRated() { - $this->_feeds = 'top_rated'; - - return $this; - } - - /** - * Returns videos most frequently flagged as favorite videos. - * - * @return this - */ - public function filterByTopFavorites() { - $this->_feeds = 'top_favorites'; - - return $this; - } - - /** - * Returns YouTube videos most frequently shared on Facebook and Twitter. - * - * @return this - */ - public function filterByMostShared() { - $this->_feeds = 'most_shared'; - return $this; - } - - /** - * Returns the most popular YouTube videos, - * - * @return this - */ - public function filterByMostPopular() { - $this->_feeds = 'most_popular'; - return $this; - } - - /** - * Returns videos most recently submitted to YouTube. - * - * @return this - */ - public function filterByMostRecent() { - $this->_feeds = 'most_recent'; - return $this; - } - - /** - * Returns YouTube videos that have received the most comments. - * - * @return this - */ - public function filterByMostDiscussed() { - $this->_feeds = 'most_discussed'; - return $this; - } - - /** - * Returns YouTube videos that receive the most video responses. - * - * @return this - */ - public function filterByMostResponded() { - $this->_feeds = 'most_responded'; - return $this; - } - - /** - * Returns videos recently featured on the YouTube home page or featured videos tab. - * - * @return this - */ - public function filterByRecentFeatured() { - $this->_feeds = 'recently_featured'; - return $this; - } - - /** - * Returns lists trending videos as seen on YouTube Trends, - * - * @return this - */ - public function filterByOnTheWeb() { - $this->_feeds = 'on_the_web'; - return $this; - } - - /** - * Returns a specific videos - * - * @param string - * @return array - */ - public function getSpecific($videoId) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - - return $this->_getResponse(sprintf(self::URL_YOUTUBE_GET, $videoId)); - } - - /** - * Returns a collection of videos of users favorites. - * - * @return array - */ - public function getFavorites() { - //populate parameters - $query = array(self::VERSION => self::VERSION_TWO); - return $this->_getResponse(sprintf(self::URL_YOUTUBE_FAVORITES, $this->_feeds), $query); - } - - /** - * Returns a collection of videos that match the API request parameters. - * - * @return array - */ - public function getList() { - return $this->_getResponse(sprintf(self::URL_YOUTUBE_FEEDS, $this->_feeds)); - } - - /** - * Returns a collection of videos from category. - * - * @param string - * @return array - */ - public function getListByCategory($category) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - - //populate parameters - $query = array( - self::CATEGORY => $category, - self::VERSION => self::VERSION_TWO); - - return $this->_getResponse(sprintf(self::URL_YOUTUBE_CATEGORY, $this->_feeds), $query); - } - - /** - * Returns a collection of videos that match the API request parameters. - * - * @param string - * @return array - */ - public function getListByRegion($regionId) { - //argument test - Eden_Google_Error::i()->argument(1, 'string'); - - //populate parameters - $query = array(self::VERSION => self::VERSION_TWO); - - return $this->_getResponse(sprintf(self::URL_YOUTUBE_REGION, $regionId, $this->_feeds), $query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Google youtube video + * + * @package Eden + * @category google + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Google_Youtube_Video extends Eden_Google_Base { + /* Constants + -------------------------------*/ + const URL_YOUTUBE_FEEDS = 'https://gdata.youtube.com/feeds/api/standardfeeds/%s'; + const URL_YOUTUBE_CATEGORY = 'https://gdata.youtube.com/feeds/api/videos'; + const URL_YOUTUBE_REGION = 'http://gdata.youtube.com/feeds/api/standardfeeds/%s/%s'; + const URL_YOUTUBE_FAVORITES = 'http://gdata.youtube.com/feeds/api/users/%s/favorites'; + const URL_YOUTUBE_GET = 'https://gdata.youtube.com/feeds/api/videos/%s'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_feeds = 'most_popular'; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($token) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + $this->_token = $token; + } + + /* Public Methods + -------------------------------*/ + /** + * Returns the most highly rated YouTube videos. + * + * @return this + */ + public function filterByTopRated() { + $this->_feeds = 'top_rated'; + + return $this; + } + + /** + * Returns videos most frequently flagged as favorite videos. + * + * @return this + */ + public function filterByTopFavorites() { + $this->_feeds = 'top_favorites'; + + return $this; + } + + /** + * Returns YouTube videos most frequently shared on Facebook and Twitter. + * + * @return this + */ + public function filterByMostShared() { + $this->_feeds = 'most_shared'; + return $this; + } + + /** + * Returns the most popular YouTube videos, + * + * @return this + */ + public function filterByMostPopular() { + $this->_feeds = 'most_popular'; + return $this; + } + + /** + * Returns videos most recently submitted to YouTube. + * + * @return this + */ + public function filterByMostRecent() { + $this->_feeds = 'most_recent'; + return $this; + } + + /** + * Returns YouTube videos that have received the most comments. + * + * @return this + */ + public function filterByMostDiscussed() { + $this->_feeds = 'most_discussed'; + return $this; + } + + /** + * Returns YouTube videos that receive the most video responses. + * + * @return this + */ + public function filterByMostResponded() { + $this->_feeds = 'most_responded'; + return $this; + } + + /** + * Returns videos recently featured on the YouTube home page or featured videos tab. + * + * @return this + */ + public function filterByRecentFeatured() { + $this->_feeds = 'recently_featured'; + return $this; + } + + /** + * Returns lists trending videos as seen on YouTube Trends, + * + * @return this + */ + public function filterByOnTheWeb() { + $this->_feeds = 'on_the_web'; + return $this; + } + + /** + * Returns a specific videos + * + * @param string + * @return array + */ + public function getSpecific($videoId) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + + return $this->_getResponse(sprintf(self::URL_YOUTUBE_GET, $videoId)); + } + + /** + * Returns a collection of videos of users favorites. + * + * @return array + */ + public function getFavorites() { + //populate parameters + $query = array(self::VERSION => self::VERSION_TWO); + return $this->_getResponse(sprintf(self::URL_YOUTUBE_FAVORITES, $this->_feeds), $query); + } + + /** + * Returns a collection of videos that match the API request parameters. + * + * @return array + */ + public function getList() { + return $this->_getResponse(sprintf(self::URL_YOUTUBE_FEEDS, $this->_feeds)); + } + + /** + * Returns a collection of videos from category. + * + * @param string + * @return array + */ + public function getListByCategory($category) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + + //populate parameters + $query = array( + self::CATEGORY => $category, + self::VERSION => self::VERSION_TWO); + + return $this->_getResponse(sprintf(self::URL_YOUTUBE_CATEGORY, $this->_feeds), $query); + } + + /** + * Returns a collection of videos that match the API request parameters. + * + * @param string + * @return array + */ + public function getListByRegion($regionId) { + //argument test + Eden_Google_Error::i()->argument(1, 'string'); + + //populate parameters + $query = array(self::VERSION => self::VERSION_TWO); + + return $this->_getResponse(sprintf(self::URL_YOUTUBE_REGION, $regionId, $this->_feeds), $query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/loader.php b/library/eden/loader.php index f274998..a134b0d 100755 --- a/library/eden/loader.php +++ b/library/eden/loader.php @@ -1,121 +1,121 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/class.php'; - -/** - * Handler for class autoloading. Many developers writing - * object-oriented applications create one PHP source file per-class - * definition. One of the biggest annoyances is having to write a - * long list of needed includes at the beginning of each script - * (one for each class). When a class is not found an Autoload - * class is used to define how it is found. I have adopted Zend's - * autoloading logic where a class name with underscores is the actual - * location of that class if the underscores were replaced with foward - * slashes. For example: Eden_Cache_Model is located at eve/cache/model. - * - * @package Eden - * @category core - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Loader extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_root = array(); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - public function __construct($eden = true) { - if($eden) { - $this->addRoot(realpath(dirname(__FILE__).'/..')); - } - } - - public function __call($name, $args) { - //if the method name starts with a capital letter - //most likely they want a class - //since we are in the loader class - //we might as well try to load it - if(preg_match("/^[A-Z]/", $name)) { - $this->load($name); - } - - return parent::__call($name, $args); - } - - /* Public Methods - -------------------------------*/ - /** - * Allows extra paths to search in before looking in the root first - * - * @param *string the path - * @return Eden_Autoload - */ - public function addRoot($path) { - //add the absolute path - array_unshift($this->_root, $path); - - return $this; - } - - /** - * Logically includes a class if not included already. - * - * @param *string the class name - * @return bool - */ - public function handler($class) { - if(!is_string($class)) { - return false; - } - - $path = str_replace(array('_', '\\'), '/', $class); - $path = '/'.strtolower($path); - $path = str_replace('//', '/', $path); - - foreach($this->_root as $root) { - $file = $root.$path.'.php'; - - if(file_exists($file) && require_once($file)) { - //then we are done - return true; - } - } - - return false; - } - - /** - * Logically includes a class if not included already. - * - * @param *string the class name - * @return this - */ - public function load($class) { - if(!class_exists($class)) { - $this->handler($class); - } - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/class.php'; + +/** + * Handler for class autoloading. Many developers writing + * object-oriented applications create one PHP source file per-class + * definition. One of the biggest annoyances is having to write a + * long list of needed includes at the beginning of each script + * (one for each class). When a class is not found an Autoload + * class is used to define how it is found. I have adopted Zend's + * autoloading logic where a class name with underscores is the actual + * location of that class if the underscores were replaced with foward + * slashes. For example: Eden_Cache_Model is located at eve/cache/model. + * + * @package Eden + * @category core + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Loader extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_root = array(); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + public function __construct($eden = true) { + if($eden) { + $this->addRoot(realpath(dirname(__FILE__).'/..')); + } + } + + public function __call($name, $args) { + //if the method name starts with a capital letter + //most likely they want a class + //since we are in the loader class + //we might as well try to load it + if(preg_match("/^[A-Z]/", $name)) { + $this->load($name); + } + + return parent::__call($name, $args); + } + + /* Public Methods + -------------------------------*/ + /** + * Allows extra paths to search in before looking in the root first + * + * @param *string the path + * @return Eden_Autoload + */ + public function addRoot($path) { + //add the absolute path + array_unshift($this->_root, $path); + + return $this; + } + + /** + * Logically includes a class if not included already. + * + * @param *string the class name + * @return bool + */ + public function handler($class) { + if(!is_string($class)) { + return false; + } + + $path = str_replace(array('_', '\\'), '/', $class); + $path = '/'.strtolower($path); + $path = str_replace('//', '/', $path); + + foreach($this->_root as $root) { + $file = $root.$path.'.php'; + + if(file_exists($file) && require_once($file)) { + //then we are done + return true; + } + } + + return false; + } + + /** + * Logically includes a class if not included already. + * + * @param *string the class name + * @return this + */ + public function load($class) { + if(!class_exists($class)) { + $this->handler($class); + } + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/loop.php b/library/eden/loop.php index 5981554..3785e86 100644 --- a/library/eden/loop.php +++ b/library/eden/loop.php @@ -1,91 +1,91 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/class.php'; - -/** - * Loops through returned result sets - * - * @package Eden - * @category core - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Loop extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_scope = NULL; - protected $_callback = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - public function __call($name, $args) { - //if the scope is null - if(is_null($this->_scope)) { - //just call the parent - return parent::__call($name, $args); - } - - //get the results from the method call - $results = $this->_getResults($name, $args); - - //lets make sure this is loopable - $loopable = is_scalar($results) ? array($results) : $results; - - //at this point we should loop through the results - foreach($loopable as $key => $value) { - call_user_func($this->_callback, $key, $value); - } - - //and return the results - return $results; - } - - /* Public Methods - -------------------------------*/ - /** - * Hijacks the class and loop through the results - * - * @param object - * @param callable - * @return this - */ - public function iterate($scope, $callback) { - Eden_Error::i() - ->argument(1, 'object') - ->argument(2, 'callable'); - - $this->_scope = $scope; - $this->_callback = $callback; - - return $this; - } - - /* Protected Methods - -------------------------------*/ - protected function _getResults($name, $args) { - if(method_exists($this->_scope, $name)) { - return call_user_func_array(array($this->_scope, $name), $args); - } - - return $this->_scope->__call($name, $args); - } - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/class.php'; + +/** + * Loops through returned result sets + * + * @package Eden + * @category core + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Loop extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_scope = NULL; + protected $_callback = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + public function __call($name, $args) { + //if the scope is null + if(is_null($this->_scope)) { + //just call the parent + return parent::__call($name, $args); + } + + //get the results from the method call + $results = $this->_getResults($name, $args); + + //lets make sure this is loopable + $loopable = is_scalar($results) ? array($results) : $results; + + //at this point we should loop through the results + foreach($loopable as $key => $value) { + call_user_func($this->_callback, $key, $value); + } + + //and return the results + return $results; + } + + /* Public Methods + -------------------------------*/ + /** + * Hijacks the class and loop through the results + * + * @param object + * @param callable + * @return this + */ + public function iterate($scope, $callback) { + Eden_Error::i() + ->argument(1, 'object') + ->argument(2, 'callable'); + + $this->_scope = $scope; + $this->_callback = $callback; + + return $this; + } + + /* Protected Methods + -------------------------------*/ + protected function _getResults($name, $args) { + if(method_exists($this->_scope, $name)) { + return call_user_func_array(array($this->_scope, $name), $args); + } + + return $this->_scope->__call($name, $args); + } + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/mail/error.php b/library/eden/mail/error.php index cec9aaf..e2af84c 100644 --- a/library/eden/mail/error.php +++ b/library/eden/mail/error.php @@ -1,45 +1,45 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Mail exception - * - * @package Eden - * @category mail - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Mail_Error extends Eden_Error { - /* Constants - -------------------------------*/ - const SERVER_ERROR = 'Problem connecting to %s . Check server, port or ssl settings for your email server.'; - const LOGIN_ERROR = 'Your email provider has rejected your login information. Verify your email and/or password is correct.'; - const TLS_ERROR = 'Problem connecting to %s with TLS on.'; - const SMTP_ADD_EMAIL = 'Adding %s to email failed.'; - const SMTP_DATA = 'Server did not allow data to be added.'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Mail exception + * + * @package Eden + * @category mail + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Mail_Error extends Eden_Error { + /* Constants + -------------------------------*/ + const SERVER_ERROR = 'Problem connecting to %s . Check server, port or ssl settings for your email server.'; + const LOGIN_ERROR = 'Your email provider has rejected your login information. Verify your email and/or password is correct.'; + const TLS_ERROR = 'Problem connecting to %s with TLS on.'; + const SMTP_ADD_EMAIL = 'Adding %s to email failed.'; + const SMTP_DATA = 'Server did not allow data to be added.'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/model.php b/library/eden/model.php index 55e7c9e..0b2e391 100755 --- a/library/eden/model.php +++ b/library/eden/model.php @@ -1,71 +1,71 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/type.php'; - -/** - * Base model that allows setting and getting of key values - * - * @package Eden - * @category model - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Model extends Eden_Type_Array { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - protected function _getMethodType(&$name) { - return false; - } - - /* Private Methods - -------------------------------*/ -} - -/** - * Model Errors - */ -class Eden_Model_Error extends Eden_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/type.php'; + +/** + * Base model that allows setting and getting of key values + * + * @package Eden + * @category model + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Model extends Eden_Type_Array { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + protected function _getMethodType(&$name) { + return false; + } + + /* Private Methods + -------------------------------*/ +} + +/** + * Model Errors + */ +class Eden_Model_Error extends Eden_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/mysql/error.php b/library/eden/mysql/error.php index ed6ce0f..7268423 100755 --- a/library/eden/mysql/error.php +++ b/library/eden/mysql/error.php @@ -1,39 +1,39 @@ - -/* - * This file is part of the Eden package. - * (c) 2010-2012 Christian Blanquera - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * MySql Errors - * - * @package Eden - * @category sql - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Mysql_Error extends Eden_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2010-2012 Christian Blanquera + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * MySql Errors + * + * @package Eden + * @category sql + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Mysql_Error extends Eden_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/oauth.php b/library/eden/oauth.php index ce9408d..cd63431 100644 --- a/library/eden/oauth.php +++ b/library/eden/oauth.php @@ -1,608 +1,608 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/curl.php'; -require_once dirname(__FILE__).'/oauth/error.php'; -require_once dirname(__FILE__).'/oauth/base.php'; -require_once dirname(__FILE__).'/oauth/consumer.php'; -require_once dirname(__FILE__).'/oauth/server.php'; - -/** - * Oauth Factory; A summary of 2-legged and 3-legged OAuth - * which can generally connect to any properly implemented - * OAuth server. - * - * @package Eden - * @category core - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Oauth extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns the oauth consumer class - * - * @return Eden_Oauth_Consumer - */ - public function consumer($url, $key, $secret) { - return Eden_Oauth_Consumer::i($url, $key, $secret); - } - - /** - * Returns an access token given the requiremets - * GET, HMAC-SHA1 - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param string token - * @param string token secret - * @param array extra query - * @param string|null realm - * @param string|null verifier - * @return string access token - */ - public function getHmacGetAccessToken($url, $key, $secret, $token, - $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string') //Argument 4 must be a string - ->argument(5, 'string') //Argument 5 must be a string - ->argument(7, 'string', 'null') //Argument 7 must be a string or null - ->argument(8, 'string', 'null'); //Argument 8 must be a string or null - - return $this->consumer($url, $key, $secret) - ->setMethodToGet() //set method to get - ->setSignatureToHmacSha1() //set method to HMAC-SHA1 - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->when($verifier) //when there is a verifier - ->setVerifier($verifier) //set the verifier - ->endWhen() //return back the consumer - ->setRequestToken($token, $tokenSecret) //set the request token - ->getToken($query); //get the token - } - - /** - * Returns an access token given the requiremets - * GET, HMAC-SHA1, use Authorization Header - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param string token - * @param string token secret - * @param array extra query - * @param string|null realm - * @param string|null verifier - * @return string access token - */ - public function getHmacGetAuthorizationAccessToken($url, $key, $secret, $token, - $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string') //Argument 4 must be a string - ->argument(5, 'string') //Argument 5 must be a string - ->argument(7, 'string', 'null') //Argument 7 must be a string or null - ->argument(8, 'string', 'null'); //Argument 8 must be a string or null - - return $this->consumer($url, $key, $secret) - ->useAuthorization() //use authorization header - ->setMethodToGet() //set method to get - ->setSignatureToHmacSha1() //set method to HMAC-SHA1 - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->when($verifier) //when there is a verifier - ->setVerifier($verifier) //set the verifier - ->endWhen() //return back the consumer - ->setRequestToken($token, $tokenSecret) //set the request token - ->getToken($query); //get the token - } - - /** - * Returns a request token given the requiremets - * GET, HMAC-SHA1, use Authorization Header - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param array extra query - * @param string|null realm - * @return string request token - */ - public function getHmacGetAuthorizationRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(5, 'string', 'null'); //Argument 5 must be a string or null - - return $this->consumer($url, $key, $secret) - ->useAuthorization() //use authorization header - ->setMethodToGet() //set method to get - ->setSignatureToHmacSha1() //set method to HMAC-SHA1 - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->getToken($query); //get the token - } - - /** - * Returns a request token given the requiremets - * GET, HMAC-SHA1 - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param array extra query - * @param string|null realm - * @return string request token - */ - public function getHmacGetRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(5, 'string', 'null'); //Argument 5 must be a string or null - - return $this->consumer($url, $key, $secret) - ->setMethodToGet() //set method to get - ->setSignatureToHmacSha1() //set method to HMAC-SHA1 - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->getToken($query); //get the token - } - - /** - * Returns an access token given the requiremets - * POST, HMAC-SHA1 - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param string token - * @param string token secret - * @param array extra query - * @param string|null realm - * @param string|null verifier - * @return string access token - */ - public function getHmacPostAccessToken($url, $key, $secret, $token, - $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string') //Argument 4 must be a string - ->argument(5, 'string') //Argument 5 must be a string - ->argument(7, 'string', 'null') //Argument 7 must be a string or null - ->argument(8, 'string', 'null'); //Argument 8 must be a string or null - - return $this->consumer($url, $key, $secret) - ->setMethodToPost() //set method to post - ->setSignatureToHmacSha1() //set method to HMAC-SHA1 - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->when($verifier) //when there is a verifier - ->setVerifier($verifier) //set the verifier - ->endWhen() //return back the consumer - ->setRequestToken($token, $tokenSecret) //set the request token - ->getToken($query); //get the token - } - - /** - * Returns an access token given the requiremets - * POST, HMAC-SHA1, use Authorization Header - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param string token - * @param string token secret - * @param array extra query - * @param string|null realm - * @param string|null verifier - * @return string access token - */ - public function getHmacPostAuthorizationAccessToken($url, $key, $secret, $token, - $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string') //Argument 4 must be a string - ->argument(5, 'string') //Argument 5 must be a string - ->argument(7, 'string', 'null') //Argument 7 must be a string or null - ->argument(8, 'string', 'null'); //Argument 8 must be a string or null - - return $this->consumer($url, $key, $secret) - ->useAuthorization() //use authorization header - ->setMethodToPost() //set method to post - ->setSignatureToHmacSha1() //set method to HMAC-SHA1 - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->when($verifier) //when there is a verifier - ->setVerifier($verifier) //set the verifier - ->endWhen() //return back the consumer - ->setRequestToken($token, $tokenSecret) //set the request token - ->getToken($query); //get the token - } - - /** - * Returns a request token given the requiremets - * POST, HMAC-SHA1, use Authorization Header - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param array extra query - * @param string|null realm - * @return string request token - */ - public function getHmacPostAuthorizationRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(5, 'string', 'null'); //Argument 5 must be a string or null - - return $this->consumer($url, $key, $secret) - ->useAuthorization() //use authorization header - ->setMethodToPost() //set method to post - ->setSignatureToHmacSha1() //set method to HMAC-SHA1 - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->getToken($query); //get the token - } - - /** - * Returns a request token given the requiremets - * POST, HMAC-SHA1 - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param array extra query - * @param string|null realm - * @return string request token - */ - public function getHmacPostRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(5, 'string', 'null'); //Argument 5 must be a string or null - - return $this->consumer($url, $key, $secret) - ->setMethodToPost() //set method to post - ->setSignatureToHmacSha1() //set method to HMAC-SHA1 - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->getToken($query); //get the token - } - - /** - * Returns an access token given the requiremets - * GET, PLAINTEXT - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param string token - * @param string token secret - * @param array extra query - * @param string|null realm - * @param string|null verifier - * @return string access token - */ - public function getPlainGetAccessToken($url, $key, $secret, $token, - $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string') //Argument 4 must be a string - ->argument(5, 'string') //Argument 5 must be a string - ->argument(7, 'string', 'null') //Argument 7 must be a string or null - ->argument(8, 'string', 'null'); //Argument 8 must be a string or null - - return $this->consumer($url, $key, $secret) - ->setMethodToGet() //set method to get - ->setSignatureToPlainText() //set method to PLAIN TEXT - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->when($verifier) //when there is a verifier - ->setVerifier($verifier) //set the verifier - ->endWhen() //return back the consumer - ->setRequestToken($token, $tokenSecret) //set the request token - ->getToken($query); //get the token - } - - /** - * Returns an access token given the requiremets - * GET, PLAINTEXT, use Authorization Header - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param string token - * @param string token secret - * @param array extra query - * @param string|null realm - * @param string|null verifier - * @return string access token - */ - public function getPlainGetAuthorizationAccessToken($url, $key, $secret, $token, - $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string') //Argument 4 must be a string - ->argument(5, 'string') //Argument 5 must be a string - ->argument(7, 'string', 'null') //Argument 7 must be a string or null - ->argument(8, 'string', 'null'); //Argument 8 must be a string or null - - return $this->consumer($url, $key, $secret) - ->useAuthorization() //use authorization header - ->setMethodToGet() //set method to get - ->setSignatureToPlainText() //set method to PLAIN TEXT - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->when($verifier) //when there is a verifier - ->setVerifier($verifier) //set the verifier - ->endWhen() //return back the consumer - ->setRequestToken($token, $tokenSecret) //set the request token - ->getToken($query); //get the token - } - - /** - * Returns a request token given the requiremets - * GET, PLAINTEXT, use Authorization Header - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param array extra query - * @param string|null realm - * @return string request token - */ - public function getPlainGetAuthorizationRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(5, 'string', 'null'); //Argument 5 must be a string or null - - return $this->consumer($url, $key, $secret) - ->useAuthorization() //use authorization header - ->setMethodToGet() //set method to get - ->setSignatureToPlainText() //set method to PLAIN TEXT - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->getToken($query); //get the token - } - - /** - * Returns a request token given the requiremets - * GET, PLAINTEXT - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param array extra query - * @param string|null realm - * @return string request token - */ - public function getPlainGetRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(5, 'string', 'null'); //Argument 5 must be a string or null - - return $this->consumer($url, $key, $secret) - ->setMethodToGet() //set method to get - ->setSignatureToPlainText() //set method to PLAIN TEXT - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->getToken($query); //get the token - } - - /** - * Returns an access token given the requiremets - * POST, PLAINTEXT - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param string token - * @param string token secret - * @param array extra query - * @param string|null realm - * @param string|null verifier - * @return string access token - */ - public function getPlainPostAccessToken($url, $key, $secret, $token, - $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string') //Argument 4 must be a string - ->argument(5, 'string') //Argument 5 must be a string - ->argument(7, 'string', 'null') //Argument 7 must be a string or null - ->argument(8, 'string', 'null'); //Argument 8 must be a string or null - - return $this->consumer($url, $key, $secret) - ->setMethodToPost() //set method to post - ->setSignatureToPlainText() //set method to PLAIN TEXT - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->when($verifier) //when there is a verifier - ->setVerifier($verifier) //set the verifier - ->endWhen() //return back the consumer - ->setRequestToken($token, $tokenSecret) //set the request token - ->getToken($query); //get the token - } - - /** - * Returns an access token given the requiremets - * POST, PLAINTEXT, use Authorization Header - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param string token - * @param string token secret - * @param array extra query - * @param string|null realm - * @param string|null verifier - * @return string access token - */ - public function getPlainPostAuthorizationAccessToken($url, $key, $secret, $token, - $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string') //Argument 4 must be a string - ->argument(5, 'string') //Argument 5 must be a string - ->argument(7, 'string', 'null') //Argument 7 must be a string or null - ->argument(8, 'string', 'null'); //Argument 8 must be a string or null - - return $this->consumer($url, $key, $secret) - ->useAuthorization() //use authorization header - ->setMethodToPost() //set method to post - ->setSignatureToPlainText() //set method to PLAIN TEXT - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->when($verifier) //when there is a verifier - ->setVerifier($verifier) //set the verifier - ->endWhen() //return back the consumer - ->setRequestToken($token, $tokenSecret) //set the request token - ->getToken($query); //get the token - } - - /** - * Returns a request token given the requiremets - * POST, PLAINTEXT, use Authorization Header - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param array extra query - * @param string|null realm - * @return string request token - */ - public function getPlainPostAuthorizationRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(5, 'string', 'null'); //Argument 5 must be a string or null - - return $this->consumer($url, $key, $secret) - ->useAuthorization() //use authorization header - ->setMethodToPost() //set method to post - ->setSignatureToPlainText() //set method to PLAIN TEXT - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->getToken($query); //get the token - } - - /** - * Returns a request token given the requiremets - * POST, PLAINTEXT - * - * @param string url - * @param string cnsumer key - * @param string consumer secret - * @param array extra query - * @param string|null realm - * @return string request token - */ - public function getPlainPostRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { - //argument test - Eden_Oauth_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(5, 'string', 'null'); //Argument 5 must be a string or null - - return $this->consumer($url, $key, $secret) - ->setMethodToPost() //set method to post - ->setSignatureToPlainText() //set method to PLAIN TEXT - ->when($realm) //when there is a realm - ->setRealm($realm) //set the realm - ->endWhen() //return back the consumer - ->getToken($query); //get the token - } - - /** - * Returns the oauth server class - * - * @return Eden_Oauth_Server - */ - public function server() { - return Eden_Oauth_Server::i(); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/curl.php'; +require_once dirname(__FILE__).'/oauth/error.php'; +require_once dirname(__FILE__).'/oauth/base.php'; +require_once dirname(__FILE__).'/oauth/consumer.php'; +require_once dirname(__FILE__).'/oauth/server.php'; + +/** + * Oauth Factory; A summary of 2-legged and 3-legged OAuth + * which can generally connect to any properly implemented + * OAuth server. + * + * @package Eden + * @category core + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Oauth extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns the oauth consumer class + * + * @return Eden_Oauth_Consumer + */ + public function consumer($url, $key, $secret) { + return Eden_Oauth_Consumer::i($url, $key, $secret); + } + + /** + * Returns an access token given the requiremets + * GET, HMAC-SHA1 + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param string token + * @param string token secret + * @param array extra query + * @param string|null realm + * @param string|null verifier + * @return string access token + */ + public function getHmacGetAccessToken($url, $key, $secret, $token, + $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string') //Argument 4 must be a string + ->argument(5, 'string') //Argument 5 must be a string + ->argument(7, 'string', 'null') //Argument 7 must be a string or null + ->argument(8, 'string', 'null'); //Argument 8 must be a string or null + + return $this->consumer($url, $key, $secret) + ->setMethodToGet() //set method to get + ->setSignatureToHmacSha1() //set method to HMAC-SHA1 + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->when($verifier) //when there is a verifier + ->setVerifier($verifier) //set the verifier + ->endWhen() //return back the consumer + ->setRequestToken($token, $tokenSecret) //set the request token + ->getToken($query); //get the token + } + + /** + * Returns an access token given the requiremets + * GET, HMAC-SHA1, use Authorization Header + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param string token + * @param string token secret + * @param array extra query + * @param string|null realm + * @param string|null verifier + * @return string access token + */ + public function getHmacGetAuthorizationAccessToken($url, $key, $secret, $token, + $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string') //Argument 4 must be a string + ->argument(5, 'string') //Argument 5 must be a string + ->argument(7, 'string', 'null') //Argument 7 must be a string or null + ->argument(8, 'string', 'null'); //Argument 8 must be a string or null + + return $this->consumer($url, $key, $secret) + ->useAuthorization() //use authorization header + ->setMethodToGet() //set method to get + ->setSignatureToHmacSha1() //set method to HMAC-SHA1 + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->when($verifier) //when there is a verifier + ->setVerifier($verifier) //set the verifier + ->endWhen() //return back the consumer + ->setRequestToken($token, $tokenSecret) //set the request token + ->getToken($query); //get the token + } + + /** + * Returns a request token given the requiremets + * GET, HMAC-SHA1, use Authorization Header + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param array extra query + * @param string|null realm + * @return string request token + */ + public function getHmacGetAuthorizationRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(5, 'string', 'null'); //Argument 5 must be a string or null + + return $this->consumer($url, $key, $secret) + ->useAuthorization() //use authorization header + ->setMethodToGet() //set method to get + ->setSignatureToHmacSha1() //set method to HMAC-SHA1 + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->getToken($query); //get the token + } + + /** + * Returns a request token given the requiremets + * GET, HMAC-SHA1 + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param array extra query + * @param string|null realm + * @return string request token + */ + public function getHmacGetRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(5, 'string', 'null'); //Argument 5 must be a string or null + + return $this->consumer($url, $key, $secret) + ->setMethodToGet() //set method to get + ->setSignatureToHmacSha1() //set method to HMAC-SHA1 + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->getToken($query); //get the token + } + + /** + * Returns an access token given the requiremets + * POST, HMAC-SHA1 + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param string token + * @param string token secret + * @param array extra query + * @param string|null realm + * @param string|null verifier + * @return string access token + */ + public function getHmacPostAccessToken($url, $key, $secret, $token, + $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string') //Argument 4 must be a string + ->argument(5, 'string') //Argument 5 must be a string + ->argument(7, 'string', 'null') //Argument 7 must be a string or null + ->argument(8, 'string', 'null'); //Argument 8 must be a string or null + + return $this->consumer($url, $key, $secret) + ->setMethodToPost() //set method to post + ->setSignatureToHmacSha1() //set method to HMAC-SHA1 + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->when($verifier) //when there is a verifier + ->setVerifier($verifier) //set the verifier + ->endWhen() //return back the consumer + ->setRequestToken($token, $tokenSecret) //set the request token + ->getToken($query); //get the token + } + + /** + * Returns an access token given the requiremets + * POST, HMAC-SHA1, use Authorization Header + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param string token + * @param string token secret + * @param array extra query + * @param string|null realm + * @param string|null verifier + * @return string access token + */ + public function getHmacPostAuthorizationAccessToken($url, $key, $secret, $token, + $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string') //Argument 4 must be a string + ->argument(5, 'string') //Argument 5 must be a string + ->argument(7, 'string', 'null') //Argument 7 must be a string or null + ->argument(8, 'string', 'null'); //Argument 8 must be a string or null + + return $this->consumer($url, $key, $secret) + ->useAuthorization() //use authorization header + ->setMethodToPost() //set method to post + ->setSignatureToHmacSha1() //set method to HMAC-SHA1 + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->when($verifier) //when there is a verifier + ->setVerifier($verifier) //set the verifier + ->endWhen() //return back the consumer + ->setRequestToken($token, $tokenSecret) //set the request token + ->getToken($query); //get the token + } + + /** + * Returns a request token given the requiremets + * POST, HMAC-SHA1, use Authorization Header + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param array extra query + * @param string|null realm + * @return string request token + */ + public function getHmacPostAuthorizationRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(5, 'string', 'null'); //Argument 5 must be a string or null + + return $this->consumer($url, $key, $secret) + ->useAuthorization() //use authorization header + ->setMethodToPost() //set method to post + ->setSignatureToHmacSha1() //set method to HMAC-SHA1 + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->getToken($query); //get the token + } + + /** + * Returns a request token given the requiremets + * POST, HMAC-SHA1 + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param array extra query + * @param string|null realm + * @return string request token + */ + public function getHmacPostRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(5, 'string', 'null'); //Argument 5 must be a string or null + + return $this->consumer($url, $key, $secret) + ->setMethodToPost() //set method to post + ->setSignatureToHmacSha1() //set method to HMAC-SHA1 + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->getToken($query); //get the token + } + + /** + * Returns an access token given the requiremets + * GET, PLAINTEXT + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param string token + * @param string token secret + * @param array extra query + * @param string|null realm + * @param string|null verifier + * @return string access token + */ + public function getPlainGetAccessToken($url, $key, $secret, $token, + $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string') //Argument 4 must be a string + ->argument(5, 'string') //Argument 5 must be a string + ->argument(7, 'string', 'null') //Argument 7 must be a string or null + ->argument(8, 'string', 'null'); //Argument 8 must be a string or null + + return $this->consumer($url, $key, $secret) + ->setMethodToGet() //set method to get + ->setSignatureToPlainText() //set method to PLAIN TEXT + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->when($verifier) //when there is a verifier + ->setVerifier($verifier) //set the verifier + ->endWhen() //return back the consumer + ->setRequestToken($token, $tokenSecret) //set the request token + ->getToken($query); //get the token + } + + /** + * Returns an access token given the requiremets + * GET, PLAINTEXT, use Authorization Header + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param string token + * @param string token secret + * @param array extra query + * @param string|null realm + * @param string|null verifier + * @return string access token + */ + public function getPlainGetAuthorizationAccessToken($url, $key, $secret, $token, + $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string') //Argument 4 must be a string + ->argument(5, 'string') //Argument 5 must be a string + ->argument(7, 'string', 'null') //Argument 7 must be a string or null + ->argument(8, 'string', 'null'); //Argument 8 must be a string or null + + return $this->consumer($url, $key, $secret) + ->useAuthorization() //use authorization header + ->setMethodToGet() //set method to get + ->setSignatureToPlainText() //set method to PLAIN TEXT + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->when($verifier) //when there is a verifier + ->setVerifier($verifier) //set the verifier + ->endWhen() //return back the consumer + ->setRequestToken($token, $tokenSecret) //set the request token + ->getToken($query); //get the token + } + + /** + * Returns a request token given the requiremets + * GET, PLAINTEXT, use Authorization Header + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param array extra query + * @param string|null realm + * @return string request token + */ + public function getPlainGetAuthorizationRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(5, 'string', 'null'); //Argument 5 must be a string or null + + return $this->consumer($url, $key, $secret) + ->useAuthorization() //use authorization header + ->setMethodToGet() //set method to get + ->setSignatureToPlainText() //set method to PLAIN TEXT + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->getToken($query); //get the token + } + + /** + * Returns a request token given the requiremets + * GET, PLAINTEXT + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param array extra query + * @param string|null realm + * @return string request token + */ + public function getPlainGetRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(5, 'string', 'null'); //Argument 5 must be a string or null + + return $this->consumer($url, $key, $secret) + ->setMethodToGet() //set method to get + ->setSignatureToPlainText() //set method to PLAIN TEXT + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->getToken($query); //get the token + } + + /** + * Returns an access token given the requiremets + * POST, PLAINTEXT + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param string token + * @param string token secret + * @param array extra query + * @param string|null realm + * @param string|null verifier + * @return string access token + */ + public function getPlainPostAccessToken($url, $key, $secret, $token, + $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string') //Argument 4 must be a string + ->argument(5, 'string') //Argument 5 must be a string + ->argument(7, 'string', 'null') //Argument 7 must be a string or null + ->argument(8, 'string', 'null'); //Argument 8 must be a string or null + + return $this->consumer($url, $key, $secret) + ->setMethodToPost() //set method to post + ->setSignatureToPlainText() //set method to PLAIN TEXT + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->when($verifier) //when there is a verifier + ->setVerifier($verifier) //set the verifier + ->endWhen() //return back the consumer + ->setRequestToken($token, $tokenSecret) //set the request token + ->getToken($query); //get the token + } + + /** + * Returns an access token given the requiremets + * POST, PLAINTEXT, use Authorization Header + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param string token + * @param string token secret + * @param array extra query + * @param string|null realm + * @param string|null verifier + * @return string access token + */ + public function getPlainPostAuthorizationAccessToken($url, $key, $secret, $token, + $tokenSecret, array $query = array(), $realm = NULL, $verifier = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string') //Argument 4 must be a string + ->argument(5, 'string') //Argument 5 must be a string + ->argument(7, 'string', 'null') //Argument 7 must be a string or null + ->argument(8, 'string', 'null'); //Argument 8 must be a string or null + + return $this->consumer($url, $key, $secret) + ->useAuthorization() //use authorization header + ->setMethodToPost() //set method to post + ->setSignatureToPlainText() //set method to PLAIN TEXT + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->when($verifier) //when there is a verifier + ->setVerifier($verifier) //set the verifier + ->endWhen() //return back the consumer + ->setRequestToken($token, $tokenSecret) //set the request token + ->getToken($query); //get the token + } + + /** + * Returns a request token given the requiremets + * POST, PLAINTEXT, use Authorization Header + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param array extra query + * @param string|null realm + * @return string request token + */ + public function getPlainPostAuthorizationRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(5, 'string', 'null'); //Argument 5 must be a string or null + + return $this->consumer($url, $key, $secret) + ->useAuthorization() //use authorization header + ->setMethodToPost() //set method to post + ->setSignatureToPlainText() //set method to PLAIN TEXT + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->getToken($query); //get the token + } + + /** + * Returns a request token given the requiremets + * POST, PLAINTEXT + * + * @param string url + * @param string cnsumer key + * @param string consumer secret + * @param array extra query + * @param string|null realm + * @return string request token + */ + public function getPlainPostRequestToken($url, $key, $secret, array $query = array(), $realm = NULL) { + //argument test + Eden_Oauth_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(5, 'string', 'null'); //Argument 5 must be a string or null + + return $this->consumer($url, $key, $secret) + ->setMethodToPost() //set method to post + ->setSignatureToPlainText() //set method to PLAIN TEXT + ->when($realm) //when there is a realm + ->setRealm($realm) //set the realm + ->endWhen() //return back the consumer + ->getToken($query); //get the token + } + + /** + * Returns the oauth server class + * + * @return Eden_Oauth_Server + */ + public function server() { + return Eden_Oauth_Server::i(); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/oauth/error.php b/library/eden/oauth/error.php index f7a2392..d03e6ae 100644 --- a/library/eden/oauth/error.php +++ b/library/eden/oauth/error.php @@ -1,39 +1,39 @@ - -/* - * This file is part of the Eden package. - * (c) 2010-2012 Christian Blanquera - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Oauth Errors - * - * @package Eden - * @category oauth - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Oauth_Error extends Eden_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2010-2012 Christian Blanquera + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Oauth Errors + * + * @package Eden + * @category oauth + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Oauth_Error extends Eden_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/oauth/server.php b/library/eden/oauth/server.php index cd159e4..1874f91 100644 --- a/library/eden/oauth/server.php +++ b/library/eden/oauth/server.php @@ -1,38 +1,38 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Oauth server methods - * - * @package Eden - * @category oauth - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Oauth_Server extends Eden_Oauth_Base { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Oauth server methods + * + * @package Eden + * @category oauth + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Oauth_Server extends Eden_Oauth_Base { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/oauth2.php b/library/eden/oauth2.php index 37f062b..17e99e0 100644 --- a/library/eden/oauth2.php +++ b/library/eden/oauth2.php @@ -1,87 +1,87 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/curl.php'; -require_once dirname(__FILE__).'/oauth2/error.php'; -require_once dirname(__FILE__).'/oauth2/abstract.php'; -require_once dirname(__FILE__).'/oauth2/client.php'; -require_once dirname(__FILE__).'/oauth2/desktop.php'; - -/** - * Oauth2 Factory class; - * - * @package Eden - * @category core oauth2 - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Oauth2 extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns oauth 2 client side class - * - * @param string The application client ID, can get through registration - * @param string The application secret, can get through registration - * @param url Your callback url or where do you want to redirect the user after authentication - * @param url The request url, can get through registration - * @param url The access url, can get through registration - * @return Eden_Oauth2_Client - */ - public function client($client, $secret, $redirect, $requestUrl, $accessUrl) { - //argument test - Eden_Oauth2_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string') //argument 2 must be a url - ->argument(3, 'url') //argument 3 must be a url - ->argument(4, 'url') //argument 4 must be a url - ->argument(5, 'url'); //argument 5 must be a url - - return Eden_Oauth2_Client::i($client, $secret, $redirect, $requestUrl, $accessUrl); - } - - /** - * Returns oauth 2 desktop class - * - * @param string The application client ID, can get through registration - * @param string The application secret, can get through registration - * @param url Your callback url or where do you want to redirect the user after authentication - * @param url The request url, can get through registration - * @param url The access url, can get through registration - * @return Eden_Oauth2_Client - */ - public function desktop($client, $secret, $redirect, $requestUrl, $accessUrl) { - //argument test - Eden_Oauth2_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string') //argument 2 must be a url - ->argument(3, 'url') //argument 3 must be a url - ->argument(4, 'url') //argument 4 must be a url - ->argument(5, 'url'); //argument 5 must be a url - - return Eden_Oauth2_Desktop::i($client, $secret, $redirect, $requestUrl, $accessUrl); - } - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/curl.php'; +require_once dirname(__FILE__).'/oauth2/error.php'; +require_once dirname(__FILE__).'/oauth2/abstract.php'; +require_once dirname(__FILE__).'/oauth2/client.php'; +require_once dirname(__FILE__).'/oauth2/desktop.php'; + +/** + * Oauth2 Factory class; + * + * @package Eden + * @category core oauth2 + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Oauth2 extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns oauth 2 client side class + * + * @param string The application client ID, can get through registration + * @param string The application secret, can get through registration + * @param url Your callback url or where do you want to redirect the user after authentication + * @param url The request url, can get through registration + * @param url The access url, can get through registration + * @return Eden_Oauth2_Client + */ + public function client($client, $secret, $redirect, $requestUrl, $accessUrl) { + //argument test + Eden_Oauth2_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string') //argument 2 must be a url + ->argument(3, 'url') //argument 3 must be a url + ->argument(4, 'url') //argument 4 must be a url + ->argument(5, 'url'); //argument 5 must be a url + + return Eden_Oauth2_Client::i($client, $secret, $redirect, $requestUrl, $accessUrl); + } + + /** + * Returns oauth 2 desktop class + * + * @param string The application client ID, can get through registration + * @param string The application secret, can get through registration + * @param url Your callback url or where do you want to redirect the user after authentication + * @param url The request url, can get through registration + * @param url The access url, can get through registration + * @return Eden_Oauth2_Client + */ + public function desktop($client, $secret, $redirect, $requestUrl, $accessUrl) { + //argument test + Eden_Oauth2_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string') //argument 2 must be a url + ->argument(3, 'url') //argument 3 must be a url + ->argument(4, 'url') //argument 4 must be a url + ->argument(5, 'url'); //argument 5 must be a url + + return Eden_Oauth2_Desktop::i($client, $secret, $redirect, $requestUrl, $accessUrl); + } + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/oauth2/abstract.php b/library/eden/oauth2/abstract.php index f9622bc..0adf385 100644 --- a/library/eden/oauth2/abstract.php +++ b/library/eden/oauth2/abstract.php @@ -1,228 +1,228 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Oauth2 abstract class - * - * @package Eden - * @category oauth2 - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -abstract class Eden_Oauth2_Abstract extends Eden_Class { - /* Constants - -------------------------------*/ - const CODE = 'code'; - const TOKEN = 'token'; - const ONLINE = 'online'; - const OFFLINE = 'offline'; - const AUTO = 'auto'; - const FORCE = 'force'; - const TYPE = 'Content-Type'; - const REQUEST = 'application/x-www-form-urlencoded'; - - const RESPONSE_TYPE = 'response_type'; - const CLIENT_ID = 'client_id'; - const REDIRECT_URL = 'redirect_uri'; - const ACCESS_TYPE = 'access_type'; - const APROVAL = 'approval_prompt'; - const CLIENT_SECRET = 'client_secret'; - const GRANT_TYPE = 'grant_type'; - const AUTHORIZATION = 'authorization_code'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_client = NULL; - protected $_secret = NULL; - protected $_redirect = NULL; - protected $_state = NULL; - protected $_scope = NULL; - protected $_display = NULL; - protected $_requestUrl = NULL; - protected $_accessUrl = NULL; - - protected $_responseType = self::CODE; - protected $_approvalPrompt = self::AUTO; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public function __construct($client, $secret, $redirect, $requestUrl, $accessUrl) { - //argument test - Eden_Oauth2_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string') //argument 2 must be a string - ->argument(3, 'url') //argument 3 must be a url - ->argument(4, 'url') //argument 4 must be a url - ->argument(5, 'url'); //argument 5 must be a url - - $this->_client = $client; - $this->_secret = $secret; - $this->_redirect = $redirect; - $this->_requestUrl = $requestUrl; - $this->_accessUrl = $accessUrl; - } - - /* Public Methods - -------------------------------*/ - /** - * Set auth to auto approve - * - * @return this - */ - public function autoApprove() { - $this->_approvalPrompt = self::AUTO; - - return $this; - } - - /** - * Set auth for force approve - * - * @return this - */ - public function forceApprove() { - $this->_approvalPrompt = self::FORCE; - - return $this; - } - - /** - * Set state - * - * @param string - * @return this - */ - public function setState($state) { - //argument 1 must be a string - Eden_Oauth2_Error::i()->argument(1, 'string'); - $this->_state = $state; - - return $this; - } - - /** - * Set scope - * - * @param string|array - * @return this - */ - public function setScope($scope) { - //argument 1 must be a string or array - Eden_Oauth2_Error::i()->argument(1, 'string', 'array'); - $this->_scope = $scope; - - return $this; - } - - /** - * Set display - * - * @param string|array - * @return this - */ - public function setDisplay($display) { - //argument 1 must be a string or array - Eden_Oauth2_Error::i()->argument(1, 'string', 'array'); - $this->_display = $display; - - return $this; - } - - /** - * Check if the response is json format - * - * @param string - * @return boolean - */ - public function isJson($string) { - //argument 1 must be a string - Eden_Oauth2_Error::i()->argument(1, 'string'); - - json_decode($string); - return (json_last_error() == JSON_ERROR_NONE); - } - - /** - * abstract function for getting login url - * - * @param string|null - * - */ - abstract public function getLoginUrl($scope = NULL, $display = NULL); - - /** - * Returns website login url - * - * @param string* - * @return array - */ - abstract public function getAccess($code); - - /* Protected Methods - -------------------------------*/ - protected function _getLoginUrl($query) { - //if there is a scope - if(!is_null($this->_scope)) { - //if scope is in array - if(is_array($this->_scope)) { - $this->_scope = implode(' ', $this->_scope); - } - //add scope to the query - $query['scope'] = $this->_scope; - } - //if there is state - if(!is_null($this->_state)) { - //add state to the query - $query['state'] = $this->_state; - } - //if there is display - if(!is_null($this->_display)) { - //add state to the query - $query['display'] = $this->_display; - } - //generate a login url - return $this->_requestUrl.'?'.http_build_query($query); - } - - - protected function _getAccess($query, $code = NULL) { - //if there is a code - if(!is_null($code)) { - //put codein the query - $query[self::CODE] = $code; - } - //set curl - $result = Eden_Curl::i() - ->setUrl($this->_accessUrl) - ->verifyHost() - ->verifyPeer() - ->setHeaders(self::TYPE, self::REQUEST) - ->setPostFields(http_build_query($query)) - ->getResponse(); - - //check if results is in JSON format - if($this->isJson($result)) { - //if it is in json, lets json decode it - $response = json_decode($result, true); - //else its not in json format - } else { - //parse it to make it an array - parse_str($result, $response); - } - - return $response; - } - - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Oauth2 abstract class + * + * @package Eden + * @category oauth2 + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +abstract class Eden_Oauth2_Abstract extends Eden_Class { + /* Constants + -------------------------------*/ + const CODE = 'code'; + const TOKEN = 'token'; + const ONLINE = 'online'; + const OFFLINE = 'offline'; + const AUTO = 'auto'; + const FORCE = 'force'; + const TYPE = 'Content-Type'; + const REQUEST = 'application/x-www-form-urlencoded'; + + const RESPONSE_TYPE = 'response_type'; + const CLIENT_ID = 'client_id'; + const REDIRECT_URL = 'redirect_uri'; + const ACCESS_TYPE = 'access_type'; + const APROVAL = 'approval_prompt'; + const CLIENT_SECRET = 'client_secret'; + const GRANT_TYPE = 'grant_type'; + const AUTHORIZATION = 'authorization_code'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_client = NULL; + protected $_secret = NULL; + protected $_redirect = NULL; + protected $_state = NULL; + protected $_scope = NULL; + protected $_display = NULL; + protected $_requestUrl = NULL; + protected $_accessUrl = NULL; + + protected $_responseType = self::CODE; + protected $_approvalPrompt = self::AUTO; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public function __construct($client, $secret, $redirect, $requestUrl, $accessUrl) { + //argument test + Eden_Oauth2_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string') //argument 2 must be a string + ->argument(3, 'url') //argument 3 must be a url + ->argument(4, 'url') //argument 4 must be a url + ->argument(5, 'url'); //argument 5 must be a url + + $this->_client = $client; + $this->_secret = $secret; + $this->_redirect = $redirect; + $this->_requestUrl = $requestUrl; + $this->_accessUrl = $accessUrl; + } + + /* Public Methods + -------------------------------*/ + /** + * Set auth to auto approve + * + * @return this + */ + public function autoApprove() { + $this->_approvalPrompt = self::AUTO; + + return $this; + } + + /** + * Set auth for force approve + * + * @return this + */ + public function forceApprove() { + $this->_approvalPrompt = self::FORCE; + + return $this; + } + + /** + * Set state + * + * @param string + * @return this + */ + public function setState($state) { + //argument 1 must be a string + Eden_Oauth2_Error::i()->argument(1, 'string'); + $this->_state = $state; + + return $this; + } + + /** + * Set scope + * + * @param string|array + * @return this + */ + public function setScope($scope) { + //argument 1 must be a string or array + Eden_Oauth2_Error::i()->argument(1, 'string', 'array'); + $this->_scope = $scope; + + return $this; + } + + /** + * Set display + * + * @param string|array + * @return this + */ + public function setDisplay($display) { + //argument 1 must be a string or array + Eden_Oauth2_Error::i()->argument(1, 'string', 'array'); + $this->_display = $display; + + return $this; + } + + /** + * Check if the response is json format + * + * @param string + * @return boolean + */ + public function isJson($string) { + //argument 1 must be a string + Eden_Oauth2_Error::i()->argument(1, 'string'); + + json_decode($string); + return (json_last_error() == JSON_ERROR_NONE); + } + + /** + * abstract function for getting login url + * + * @param string|null + * + */ + abstract public function getLoginUrl($scope = NULL, $display = NULL); + + /** + * Returns website login url + * + * @param string* + * @return array + */ + abstract public function getAccess($code); + + /* Protected Methods + -------------------------------*/ + protected function _getLoginUrl($query) { + //if there is a scope + if(!is_null($this->_scope)) { + //if scope is in array + if(is_array($this->_scope)) { + $this->_scope = implode(' ', $this->_scope); + } + //add scope to the query + $query['scope'] = $this->_scope; + } + //if there is state + if(!is_null($this->_state)) { + //add state to the query + $query['state'] = $this->_state; + } + //if there is display + if(!is_null($this->_display)) { + //add state to the query + $query['display'] = $this->_display; + } + //generate a login url + return $this->_requestUrl.'?'.http_build_query($query); + } + + + protected function _getAccess($query, $code = NULL) { + //if there is a code + if(!is_null($code)) { + //put codein the query + $query[self::CODE] = $code; + } + //set curl + $result = Eden_Curl::i() + ->setUrl($this->_accessUrl) + ->verifyHost() + ->verifyPeer() + ->setHeaders(self::TYPE, self::REQUEST) + ->setPostFields(http_build_query($query)) + ->getResponse(); + + //check if results is in JSON format + if($this->isJson($result)) { + //if it is in json, lets json decode it + $response = json_decode($result, true); + //else its not in json format + } else { + //parse it to make it an array + parse_str($result, $response); + } + + return $response; + } + + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/oauth2/desktop.php b/library/eden/oauth2/desktop.php index 21a9e67..2a52880 100644 --- a/library/eden/oauth2/desktop.php +++ b/library/eden/oauth2/desktop.php @@ -1,95 +1,95 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Oauth2 desktop class - * - * @package Eden - * @category desktop - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Oauth2_Desktop extends Eden_Oauth2_Abstract { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_responseType = self::CODE; - protected $_grantType = 'authorization_code'; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns website login url - * - * @param string|null - * @param string|null - * @return url - */ - public function getLoginUrl($scope = NULL, $display = NULL) { - //argument test - Eden_Oauth2_Error::i() - ->argument(1, 'string', 'array', 'null') //argument 1 must be a string, array or null - ->argument(2, 'string', 'array', 'null'); //argument 2 must be a string, array or null - - //if scope in not null - if(!is_null($scope)) { - //lets set the scope - $this->setScope($scope); - } - //if display in not null - if(!is_null($display)) { - //lets set the display - $this->setDisplay($display); - } - - //populate fields - $query = array( - self::RESPONSE_TYPE => $this->_responseType, - self::CLIENT_ID => $this->_client, - self::REDIRECT_URL => $this->_redirect); - - return $this->_getLoginUrl($query); - - } - - /** - * Returns website login url - * - * @param string* - * @return array - */ - public function getAccess($code) { - //argument 1 must be a string - Eden_Oauth2_Error::i()->argument(1, 'string'); - - //populate fields - $query = array( - self::CLIENT_ID => $this->_client, - self::CLIENT_SECRET => $this->_secret, - self::REDIRECT_URL => $this->_redirect, - self::GRANT_TYPE => $this->_grantType); - - return $this->_getAccess($query, $code); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ -} + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Oauth2 desktop class + * + * @package Eden + * @category desktop + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Oauth2_Desktop extends Eden_Oauth2_Abstract { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_responseType = self::CODE; + protected $_grantType = 'authorization_code'; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns website login url + * + * @param string|null + * @param string|null + * @return url + */ + public function getLoginUrl($scope = NULL, $display = NULL) { + //argument test + Eden_Oauth2_Error::i() + ->argument(1, 'string', 'array', 'null') //argument 1 must be a string, array or null + ->argument(2, 'string', 'array', 'null'); //argument 2 must be a string, array or null + + //if scope in not null + if(!is_null($scope)) { + //lets set the scope + $this->setScope($scope); + } + //if display in not null + if(!is_null($display)) { + //lets set the display + $this->setDisplay($display); + } + + //populate fields + $query = array( + self::RESPONSE_TYPE => $this->_responseType, + self::CLIENT_ID => $this->_client, + self::REDIRECT_URL => $this->_redirect); + + return $this->_getLoginUrl($query); + + } + + /** + * Returns website login url + * + * @param string* + * @return array + */ + public function getAccess($code) { + //argument 1 must be a string + Eden_Oauth2_Error::i()->argument(1, 'string'); + + //populate fields + $query = array( + self::CLIENT_ID => $this->_client, + self::CLIENT_SECRET => $this->_secret, + self::REDIRECT_URL => $this->_redirect, + self::GRANT_TYPE => $this->_grantType); + + return $this->_getAccess($query, $code); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ +} diff --git a/library/eden/path.php b/library/eden/path.php index 78c36fb..df1459f 100644 --- a/library/eden/path.php +++ b/library/eden/path.php @@ -1,309 +1,309 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/type.php'; - -/** - * General available methods for common pathing issues - * - * @package Eden - * @category core - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Path extends Eden_Type_String implements ArrayAccess { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($path) { - //argument 1 must be a string - Eden_Path_Error::i()->argument(1, 'string'); - parent::__construct($this->_format($path)); - } - - public function __toString() { - return $this->_data; - } - - /* Public Methods - -------------------------------*/ - /** - * Attempts to get the full absolute path - * as described on the server. The path - * given must exist. - * - * @param string|null root path - * @return this - */ - public function absolute($root = NULL) { - //argument 1 must be a string or null - Eden_Path_Error::i()->argument(1, 'string', 'null'); - - //if path is a directory or file - if(is_dir($this->_data) || is_file($this->_data)) { - return $this; - } - - //if root is null - if(is_null($root)) { - //assume the root is doc root - $root = $_SERVER['DOCUMENT_ROOT']; - } - - //get the absolute path - $absolute = $this->_format($root).$this->_data; - - //if absolute is a directory or file - if(is_dir($absolute) || is_file($absolute)) { - $this->_data = $absolute; - return $this; - } - - //if we are here then it means that no path was found so we should throw an exception - Eden_Path_Error::i() - ->setMessage(Eden_Path_Error::FULL_PATH_NOT_FOUND) - ->addVariable($this->_data) - ->addVariable($absolute) - ->trigger(); - } - - /** - * Adds a path to the existing one - * - * @param string[,string..] - * @return this - */ - public function append($path) { - //argument 1 must be a string - $error = Eden_Path_Error::i()->argument(1, 'string'); - - //each argument will be a path - $paths = func_get_args(); - - //for each path - foreach($paths as $i => $path) { - //check for type errors - $error->argument($i + 1, $path, 'string'); - //add to path - $this->_data .= $this->_format($path); - } - - return $this; - } - - /** - * Returns the path array - * - * @return array - */ - public function getArray() { - return explode('/', $this->_data); - } - - /** - * isset using the ArrayAccess interface - * - * @param number - * @return bool - */ - public function offsetExists($offset) { - return in_array($offset, $this->getArray()); - } - - /** - * returns data using the ArrayAccess interface - * - * @param number - * @return bool - */ - public function offsetGet($offset) { - $pathArray = $this->getArray(); - - if($offset == 'first') { - $offset = 0; - } - - if($offset == 'last') { - $offset = count($pathArray) - 1; - } - - if(is_numeric($offset)) { - - return isset($pathArray[$offset]) ? $pathArray[$offset] : NULL; - } - - return NULL; - } - - /** - * Sets data using the ArrayAccess interface - * - * @param number - * @param mixed - * @return void - */ - public function offsetSet($offset, $value) { - if (is_null($offset)) { - $this->append($value); - } else if($offset == 'prepend') { - $this->prepend($value); - } else if($offset == 'replace') { - $this->replace($value); - } else { - $pathArray = $this->getArray(); - if($offset > 0 && $offset < count($pathArray)) { - $pathArray[$offset] = $value; - $this->_data = implode('/', $pathArray); - } - } - } - - /** - * unsets using the ArrayAccess interface - * - * @param number - * @return bool - */ - public function offsetUnset($offset) {} - - /** - * Adds a path before the existing one - * - * @param string[,string..] - * @return string - */ - public function prepend($path) { - //argument 1 must be a string - $error = Eden_Path_Error::i()->argument(1, 'string'); - - //each argument will be a path - $paths = func_get_args(); - - //for each path - foreach($paths as $i => $path) { - //check for type errors - $error->argument($i + 1, $path, 'string'); - //add to path - $this->_data = $this->_format($path).$this->_data; - } - - return $this; - } - - /** - * Remove the last path - * - * @return this - */ - public function pop(){ - //get the path array - $pathArray = $this->getArray(); - - //remove the last - $path = array_pop($pathArray); - - //set path - $this->_data = implode('/', $pathArray); - - return $path; - } - - /** - * Replaces the last path with this one - * - * @param string - * @return string - */ - public function replace($path) { - //argument 1 must be a string - Eden_Path_Error::i()->argument(1, 'string'); - - //get the path array - $pathArray = $this->getArray(); - - //pop out the last - array_pop($pathArray); - - //push in the new - $pathArray[] = $path; - - //assign back to path - $this->_data = implode('/', $pathArray); - - return $this; - } - - /* Protected Methods - -------------------------------*/ - protected function _format($path) { - //replace back slash with forward - $path = str_replace('\\', '/', $path); - - //replace double forward slash with 1 forward slash - $path = str_replace('//', '/', $path); - - //if there is a last forward slash - if(substr($path, -1, 1) == '/') { - //remove it - $path = substr($path, 0, -1); - } - - //if the path does not start with a foward slash - //and the path does not have a colon - //(this is a test for windows) - if(substr($path, 0, 1) != '/' && !preg_match("/^[A-Za-z]+\:/", $path)) { - //it's safe to add a slash - $path = '/'.$path; - } - - return $path; - } - - /* Private Methods - -------------------------------*/ -} - -/** - * Timezone Errors - */ -class Eden_Path_Error extends Eden_Error { - /* Constants - -------------------------------*/ - const FULL_PATH_NOT_FOUND = 'The path %s or %s was not found.'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/type.php'; + +/** + * General available methods for common pathing issues + * + * @package Eden + * @category core + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Path extends Eden_Type_String implements ArrayAccess { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($path) { + //argument 1 must be a string + Eden_Path_Error::i()->argument(1, 'string'); + parent::__construct($this->_format($path)); + } + + public function __toString() { + return $this->_data; + } + + /* Public Methods + -------------------------------*/ + /** + * Attempts to get the full absolute path + * as described on the server. The path + * given must exist. + * + * @param string|null root path + * @return this + */ + public function absolute($root = NULL) { + //argument 1 must be a string or null + Eden_Path_Error::i()->argument(1, 'string', 'null'); + + //if path is a directory or file + if(is_dir($this->_data) || is_file($this->_data)) { + return $this; + } + + //if root is null + if(is_null($root)) { + //assume the root is doc root + $root = $_SERVER['DOCUMENT_ROOT']; + } + + //get the absolute path + $absolute = $this->_format($root).$this->_data; + + //if absolute is a directory or file + if(is_dir($absolute) || is_file($absolute)) { + $this->_data = $absolute; + return $this; + } + + //if we are here then it means that no path was found so we should throw an exception + Eden_Path_Error::i() + ->setMessage(Eden_Path_Error::FULL_PATH_NOT_FOUND) + ->addVariable($this->_data) + ->addVariable($absolute) + ->trigger(); + } + + /** + * Adds a path to the existing one + * + * @param string[,string..] + * @return this + */ + public function append($path) { + //argument 1 must be a string + $error = Eden_Path_Error::i()->argument(1, 'string'); + + //each argument will be a path + $paths = func_get_args(); + + //for each path + foreach($paths as $i => $path) { + //check for type errors + $error->argument($i + 1, $path, 'string'); + //add to path + $this->_data .= $this->_format($path); + } + + return $this; + } + + /** + * Returns the path array + * + * @return array + */ + public function getArray() { + return explode('/', $this->_data); + } + + /** + * isset using the ArrayAccess interface + * + * @param number + * @return bool + */ + public function offsetExists($offset) { + return in_array($offset, $this->getArray()); + } + + /** + * returns data using the ArrayAccess interface + * + * @param number + * @return bool + */ + public function offsetGet($offset) { + $pathArray = $this->getArray(); + + if($offset == 'first') { + $offset = 0; + } + + if($offset == 'last') { + $offset = count($pathArray) - 1; + } + + if(is_numeric($offset)) { + + return isset($pathArray[$offset]) ? $pathArray[$offset] : NULL; + } + + return NULL; + } + + /** + * Sets data using the ArrayAccess interface + * + * @param number + * @param mixed + * @return void + */ + public function offsetSet($offset, $value) { + if (is_null($offset)) { + $this->append($value); + } else if($offset == 'prepend') { + $this->prepend($value); + } else if($offset == 'replace') { + $this->replace($value); + } else { + $pathArray = $this->getArray(); + if($offset > 0 && $offset < count($pathArray)) { + $pathArray[$offset] = $value; + $this->_data = implode('/', $pathArray); + } + } + } + + /** + * unsets using the ArrayAccess interface + * + * @param number + * @return bool + */ + public function offsetUnset($offset) {} + + /** + * Adds a path before the existing one + * + * @param string[,string..] + * @return string + */ + public function prepend($path) { + //argument 1 must be a string + $error = Eden_Path_Error::i()->argument(1, 'string'); + + //each argument will be a path + $paths = func_get_args(); + + //for each path + foreach($paths as $i => $path) { + //check for type errors + $error->argument($i + 1, $path, 'string'); + //add to path + $this->_data = $this->_format($path).$this->_data; + } + + return $this; + } + + /** + * Remove the last path + * + * @return this + */ + public function pop(){ + //get the path array + $pathArray = $this->getArray(); + + //remove the last + $path = array_pop($pathArray); + + //set path + $this->_data = implode('/', $pathArray); + + return $path; + } + + /** + * Replaces the last path with this one + * + * @param string + * @return string + */ + public function replace($path) { + //argument 1 must be a string + Eden_Path_Error::i()->argument(1, 'string'); + + //get the path array + $pathArray = $this->getArray(); + + //pop out the last + array_pop($pathArray); + + //push in the new + $pathArray[] = $path; + + //assign back to path + $this->_data = implode('/', $pathArray); + + return $this; + } + + /* Protected Methods + -------------------------------*/ + protected function _format($path) { + //replace back slash with forward + $path = str_replace('\\', '/', $path); + + //replace double forward slash with 1 forward slash + $path = str_replace('//', '/', $path); + + //if there is a last forward slash + if(substr($path, -1, 1) == '/') { + //remove it + $path = substr($path, 0, -1); + } + + //if the path does not start with a foward slash + //and the path does not have a colon + //(this is a test for windows) + if(substr($path, 0, 1) != '/' && !preg_match("/^[A-Za-z]+\:/", $path)) { + //it's safe to add a slash + $path = '/'.$path; + } + + return $path; + } + + /* Private Methods + -------------------------------*/ +} + +/** + * Timezone Errors + */ +class Eden_Path_Error extends Eden_Error { + /* Constants + -------------------------------*/ + const FULL_PATH_NOT_FOUND = 'The path %s or %s was not found.'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/paypal.php b/library/eden/paypal.php index 1fc747c..bf2bf79 100644 --- a/library/eden/paypal.php +++ b/library/eden/paypal.php @@ -1,213 +1,213 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/curl.php'; -require_once dirname(__FILE__).'/paypal/error.php'; -require_once dirname(__FILE__).'/paypal/base.php'; -require_once dirname(__FILE__).'/paypal/authorization.php'; -require_once dirname(__FILE__).'/paypal/base.php'; -require_once dirname(__FILE__).'/paypal/billing.php'; -require_once dirname(__FILE__).'/paypal/button.php'; -require_once dirname(__FILE__).'/paypal/checkout.php'; -require_once dirname(__FILE__).'/paypal/direct.php'; -require_once dirname(__FILE__).'/paypal/recurring.php'; -require_once dirname(__FILE__).'/paypal/transaction.php'; - -/** - * Paypal API factory. This is a factory class with - * methods that will load up different Paypal API methods. - * Paypal classes are organized as described on their - * developer site: Express Checkout, Transaction, - * Authorization, Direct Payment, Recurring Payment, - * Button Manager and Billing Agreement - * - * @package Eden - * @category Paypal - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Paypal extends Eden_Class { - /* Constants - -------------------------------*/ - const PEM = '/paypal/cacert.pem'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns paypal authorization - * - * @param string API username - * @param string API password - * @param string API signature - * @param string API certificate file - * @return Eden_Paypal_Authorization - */ - public function authorization($user, $password, $signature, $certificate = NULL) { - Eden_Paypal_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string', 'null'); - - if(!is_string($certificate)) { - $certificate = dirname(__FILE__).self::PEM; - } - - return Eden_Paypal_Authorization::i($user, $password, $signature, $certificate); - } - - /** - * Returns paypal billing - * - * @param string API username - * @param string API password - * @param string API signature - * @param string API certificate file - * @return Eden_Paypal_Billing - */ - public function billing($user, $password, $signature, $certificate = NULL) { - if(!is_string($certificate)) { - $certificate = dirname(__FILE__).self::PEM; - } - - return Eden_Paypal_Billing::i($user, $password, $signature, $certificate); - } - - /** - * Returns paypal button - * - * @param string API username - * @param string API password - * @param string API signature - * @param string API certificate file - * @return Eden_Paypal_Button - */ - public function button($user, $password, $signature, $certificate = NULL) { - Eden_Paypal_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string', 'null'); - - if(!is_string($certificate)) { - $certificate = dirname(__FILE__).self::PEM; - } - - return Eden_Paypal_Button::i($user, $password, $signature, $certificate); - } - - /** - * Returns paypal express checkout - * - * @param string - * @param string API username - * @param string API password - * @param string API signature - * @param string|null API certificate file - * @return Eden_Paypal_Checkout - */ - public function checkout($user, $password, $signature, $certificate = NULL, $live = false) { - Eden_Paypal_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string', 'null'); - - if(!is_string($certificate)) { - $certificate = dirname(__FILE__).self::PEM; - } - - return Eden_Paypal_Checkout::i($user, $password, $signature, $certificate, $live); - } - - /** - * Returns paypal directPayment - * - * @param string API username - * @param string API password - * @param string API signature - * @param string API certificate file - * @return Eden_Paypal_Direct - */ - public function direct($user, $password, $signature, $certificate = NULL) { - Eden_Paypal_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string', 'null'); - - if(!is_string($certificate)) { - $certificate = dirname(__FILE__).self::PEM; - } - - return Eden_Paypal_Direct::i($user, $password, $signature, $certificate); - } - - /** - * Returns paypal recurringPayment - * - * @param string API username - * @param string API password - * @param string API signature - * @param string API certificate file - * @return Eden_Paypal_Recurring - */ - public function recurring($user, $password, $signature, $certificate = NULL) { - Eden_Paypal_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string', 'null'); - - if(!is_string($certificate)) { - $certificate = dirname(__FILE__).self::PEM; - } - - return Eden_Paypal_Recurring::i($user, $password, $signature, $certificate); - } - - /** - * Returns paypal transaction - * - * @param string API username - * @param string API password - * @param string API signature - * @param string API certificate file - * @return Eden_Paypal_Transaction - */ - public function transaction($user, $password, $signature, $certificate = NULL) { - Eden_Paypal_Error::i() - ->argument(1, 'string') - ->argument(2, 'string') - ->argument(3, 'string') - ->argument(4, 'string', 'null'); - - if(!is_string($certificate)) { - $certificate = dirname(__FILE__).self::PEM; - } - - return Eden_Paypal_Transaction::i($user, $password, $signature, $certificate); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/curl.php'; +require_once dirname(__FILE__).'/paypal/error.php'; +require_once dirname(__FILE__).'/paypal/base.php'; +require_once dirname(__FILE__).'/paypal/authorization.php'; +require_once dirname(__FILE__).'/paypal/base.php'; +require_once dirname(__FILE__).'/paypal/billing.php'; +require_once dirname(__FILE__).'/paypal/button.php'; +require_once dirname(__FILE__).'/paypal/checkout.php'; +require_once dirname(__FILE__).'/paypal/direct.php'; +require_once dirname(__FILE__).'/paypal/recurring.php'; +require_once dirname(__FILE__).'/paypal/transaction.php'; + +/** + * Paypal API factory. This is a factory class with + * methods that will load up different Paypal API methods. + * Paypal classes are organized as described on their + * developer site: Express Checkout, Transaction, + * Authorization, Direct Payment, Recurring Payment, + * Button Manager and Billing Agreement + * + * @package Eden + * @category Paypal + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Paypal extends Eden_Class { + /* Constants + -------------------------------*/ + const PEM = '/paypal/cacert.pem'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns paypal authorization + * + * @param string API username + * @param string API password + * @param string API signature + * @param string API certificate file + * @return Eden_Paypal_Authorization + */ + public function authorization($user, $password, $signature, $certificate = NULL) { + Eden_Paypal_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string', 'null'); + + if(!is_string($certificate)) { + $certificate = dirname(__FILE__).self::PEM; + } + + return Eden_Paypal_Authorization::i($user, $password, $signature, $certificate); + } + + /** + * Returns paypal billing + * + * @param string API username + * @param string API password + * @param string API signature + * @param string API certificate file + * @return Eden_Paypal_Billing + */ + public function billing($user, $password, $signature, $certificate = NULL) { + if(!is_string($certificate)) { + $certificate = dirname(__FILE__).self::PEM; + } + + return Eden_Paypal_Billing::i($user, $password, $signature, $certificate); + } + + /** + * Returns paypal button + * + * @param string API username + * @param string API password + * @param string API signature + * @param string API certificate file + * @return Eden_Paypal_Button + */ + public function button($user, $password, $signature, $certificate = NULL) { + Eden_Paypal_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string', 'null'); + + if(!is_string($certificate)) { + $certificate = dirname(__FILE__).self::PEM; + } + + return Eden_Paypal_Button::i($user, $password, $signature, $certificate); + } + + /** + * Returns paypal express checkout + * + * @param string + * @param string API username + * @param string API password + * @param string API signature + * @param string|null API certificate file + * @return Eden_Paypal_Checkout + */ + public function checkout($user, $password, $signature, $certificate = NULL, $live = false) { + Eden_Paypal_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string', 'null'); + + if(!is_string($certificate)) { + $certificate = dirname(__FILE__).self::PEM; + } + + return Eden_Paypal_Checkout::i($user, $password, $signature, $certificate, $live); + } + + /** + * Returns paypal directPayment + * + * @param string API username + * @param string API password + * @param string API signature + * @param string API certificate file + * @return Eden_Paypal_Direct + */ + public function direct($user, $password, $signature, $certificate = NULL) { + Eden_Paypal_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string', 'null'); + + if(!is_string($certificate)) { + $certificate = dirname(__FILE__).self::PEM; + } + + return Eden_Paypal_Direct::i($user, $password, $signature, $certificate); + } + + /** + * Returns paypal recurringPayment + * + * @param string API username + * @param string API password + * @param string API signature + * @param string API certificate file + * @return Eden_Paypal_Recurring + */ + public function recurring($user, $password, $signature, $certificate = NULL) { + Eden_Paypal_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string', 'null'); + + if(!is_string($certificate)) { + $certificate = dirname(__FILE__).self::PEM; + } + + return Eden_Paypal_Recurring::i($user, $password, $signature, $certificate); + } + + /** + * Returns paypal transaction + * + * @param string API username + * @param string API password + * @param string API signature + * @param string API certificate file + * @return Eden_Paypal_Transaction + */ + public function transaction($user, $password, $signature, $certificate = NULL) { + Eden_Paypal_Error::i() + ->argument(1, 'string') + ->argument(2, 'string') + ->argument(3, 'string') + ->argument(4, 'string', 'null'); + + if(!is_string($certificate)) { + $certificate = dirname(__FILE__).self::PEM; + } + + return Eden_Paypal_Transaction::i($user, $password, $signature, $certificate); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/paypal/base.php b/library/eden/paypal/base.php index e35470c..354628f 100644 --- a/library/eden/paypal/base.php +++ b/library/eden/paypal/base.php @@ -1,118 +1,118 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Paypal Base - * - * @package Eden - * @category paypal - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Paypal_Base extends Eden_Class { - /* Constants - -------------------------------*/ - const VERSION = '84.0'; - const TEST_URL = 'https://api-3t.sandbox.paypal.com/nvp'; - const LIVE_URL = 'https://api-3t.paypal.com/nvp'; - const SANDBOX_URL = 'https://test.authorize.net/gateway/transact.dll'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_meta = array(); - protected $_url = NULL; - protected $_user = NULL; - protected $_password = NULL; - protected $_signature = NULL; - protected $_certificate = NULL; - - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - /* Magic - -------------------------------*/ - public function __construct($user, $password, $signature, $certificate, $live = false) { - $this->_user = $user; - $this->_password = $password; - $this->_signature = $signature; - $this->_certificate = $certificate; - - $this->_url = self::TEST_URL; - $this->_baseUrl = self::TEST_URL; - if($live) { - $this->_url = self::LIVE_URL; - $this->_baseUrl = self::LIVE_URL; - } - } - - /* Public Methods - -------------------------------*/ - /** - * Populates after a request has been sent - * - * @return array - */ - public function getMeta() { - return $this->_meta; - } - - /* Protected Methods - -------------------------------*/ - protected function _accessKey($array) { - foreach($array as $key => $val) { - if(is_array($val)) { - $array[$key] = $this->_accessKey($val); - } - - if($val == false || $val == NULL || empty($val) || !$val) { - unset($array[$key]); - } - - } - - return $array; - } - - protected function _request($method, array $query = array(), $post = true) { - //Argument 1 must be a string - Eden_Paypal_Error::i()->argument(1, 'string'); - - //Our request parameters - $default = array( - 'USER' => $this->_user, - 'PWD' => $this->_password, - 'SIGNATURE' => $this->_signature, - 'VERSION' => self::VERSION, - 'METHOD' => $method); - - //generate URL-encoded query string to build our NVP string - $query = http_build_query($query + $default); - - $curl = Eden_Curl::i() - ->setUrl($this->_baseUrl) - ->setVerbose(true) - ->setCaInfo($this->_certificate) - ->setPost(true) - ->setPostFields($query); - - $response = $curl->getQueryResponse(); - - $this->_meta['url'] = $this->_baseUrl; - $this->_meta['query'] = $query; - $this->_meta['curl'] = $curl->getMeta(); - $this->_meta['response'] = $response; - - return $response; - } - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Paypal Base + * + * @package Eden + * @category paypal + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Paypal_Base extends Eden_Class { + /* Constants + -------------------------------*/ + const VERSION = '84.0'; + const TEST_URL = 'https://api-3t.sandbox.paypal.com/nvp'; + const LIVE_URL = 'https://api-3t.paypal.com/nvp'; + const SANDBOX_URL = 'https://test.authorize.net/gateway/transact.dll'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_meta = array(); + protected $_url = NULL; + protected $_user = NULL; + protected $_password = NULL; + protected $_signature = NULL; + protected $_certificate = NULL; + + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + /* Magic + -------------------------------*/ + public function __construct($user, $password, $signature, $certificate, $live = false) { + $this->_user = $user; + $this->_password = $password; + $this->_signature = $signature; + $this->_certificate = $certificate; + + $this->_url = self::TEST_URL; + $this->_baseUrl = self::TEST_URL; + if($live) { + $this->_url = self::LIVE_URL; + $this->_baseUrl = self::LIVE_URL; + } + } + + /* Public Methods + -------------------------------*/ + /** + * Populates after a request has been sent + * + * @return array + */ + public function getMeta() { + return $this->_meta; + } + + /* Protected Methods + -------------------------------*/ + protected function _accessKey($array) { + foreach($array as $key => $val) { + if(is_array($val)) { + $array[$key] = $this->_accessKey($val); + } + + if($val == false || $val == NULL || empty($val) || !$val) { + unset($array[$key]); + } + + } + + return $array; + } + + protected function _request($method, array $query = array(), $post = true) { + //Argument 1 must be a string + Eden_Paypal_Error::i()->argument(1, 'string'); + + //Our request parameters + $default = array( + 'USER' => $this->_user, + 'PWD' => $this->_password, + 'SIGNATURE' => $this->_signature, + 'VERSION' => self::VERSION, + 'METHOD' => $method); + + //generate URL-encoded query string to build our NVP string + $query = http_build_query($query + $default); + + $curl = Eden_Curl::i() + ->setUrl($this->_baseUrl) + ->setVerbose(true) + ->setCaInfo($this->_certificate) + ->setPost(true) + ->setPostFields($query); + + $response = $curl->getQueryResponse(); + + $this->_meta['url'] = $this->_baseUrl; + $this->_meta['query'] = $query; + $this->_meta['curl'] = $curl->getMeta(); + $this->_meta['response'] = $response; + + return $response; + } + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/paypal/cacert.pem b/library/eden/paypal/cacert.pem index cb4d18b..f855799 100644 --- a/library/eden/paypal/cacert.pem +++ b/library/eden/paypal/cacert.pem @@ -1,3379 +1,3379 @@ - - -
##
-## ca-bundle.crt -- Bundle of CA Root Certificates
-##
-## Certificate data from Mozilla as of: Thu Nov  3 19:04:19 2011
-##
-## This is a bundle of X.509 certificates of public Certificate Authorities
-## (CA). These were automatically extracted from Mozilla's root certificates
-## file (certdata.txt).  This file can be found in the mozilla source tree:
-## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
-##
-## It contains the certificates in PEM format and therefore
-## can be directly used with curl / libcurl / php_curl, or with
-## an Apache+mod_ssl webserver for SSL client authentication.
-## Just configure this file as the SSLCACertificateFile.
-##
-
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Netscape security libraries.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1994-2000
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
-
-GTE CyberTrust Global Root
-==========================
------BEGIN CERTIFICATE-----
-MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
-Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
-A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
-MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
-Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
-IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
-sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
-HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
-AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
-M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
-NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
------END CERTIFICATE-----
-
-Thawte Server CA
-================
------BEGIN CERTIFICATE-----
-MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
-DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
-dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
-AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
-b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
-BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
-c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
-A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
-ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
-/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
-1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
-MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
-GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
-GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
------END CERTIFICATE-----
-
-Thawte Premium Server CA
-========================
------BEGIN CERTIFICATE-----
-MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
-DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
-dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
-AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
-ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
-AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
-VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
-aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
-cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
-aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
-Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
-qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
-SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
-8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
-UCemDaYj+bvLpgcUQg==
------END CERTIFICATE-----
-
-Equifax Secure CA
-=================
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
-ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
-MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
-B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
-fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
-8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
-A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
-CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
-A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
-spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
-Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
-zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
-BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
-70+sB3c4
------END CERTIFICATE-----
-
-Digital Signature Trust Co. Global CA 1
-=======================================
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
-ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
-MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
-IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
-NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
-o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
-BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
-dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
-BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
-ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
-kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
-RbyhkwS7hp86W0N6w4pl
------END CERTIFICATE-----
-
-Digital Signature Trust Co. Global CA 3
-=======================================
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
-ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
-MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
-IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
-VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
-xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
-BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
-dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
-BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
-AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
-up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
-mPnHfxsb1gYgAlihw6ID
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
-f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
-hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
-TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
-WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
-Tqj/ZA1k
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority - G2
-============================================================
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
-FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
-lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
-MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
-1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
-Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
------END CERTIFICATE-----
-
-Verisign Class 4 Public Primary Certification Authority - G2
-============================================================
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4
-xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDH
-qGKB3FtKqsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQAB
-MA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGIL4LcY/oCRaxF
-WdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0ycyfYaT5DdPauxYma51N86Xv2S/PB
-ZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRPT8qAkbYp
------END CERTIFICATE-----
-
-GlobalSign Root CA
-==================
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
-GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
-b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
-BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
-VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
-DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
-THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
-Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
-c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
-gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
-AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
-Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
-j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
-hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
-X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
------END CERTIFICATE-----
-
-GlobalSign Root CA - R2
-=======================
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
-YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
-bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
-aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
-bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
-ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
-s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
-S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
-TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
-ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
-FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
-YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
-BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
-9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
-01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
-9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
-TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
------END CERTIFICATE-----
-
-ValiCert Class 1 VA
-===================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
-MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
-GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
-DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
-lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
-icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
-Orf1LXLI
------END CERTIFICATE-----
-
-ValiCert Class 2 VA
-===================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
-MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
-CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
-ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
-SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
-UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
-W9ViH0Pd
------END CERTIFICATE-----
-
-RSA Root Certificate 1
-======================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
-MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
-3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
-BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
-3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
-V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
-on+jjBXu
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
-EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
-cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
-EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
-055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
-j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
-/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
-xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
-t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
------END CERTIFICATE-----
-
-Verisign Class 4 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
-tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
-8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
-Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
-Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
-mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
-fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
-RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
-UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
------END CERTIFICATE-----
-
-Entrust.net Secure Server CA
-============================
------BEGIN CERTIFICATE-----
-MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
-BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
-cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
-ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
-A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
-eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
-dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
-aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
-gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
-ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
-CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
-dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
-bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
-dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
-NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
-HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
-BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
-Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
-n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
------END CERTIFICATE-----
-
-Entrust.net Premium 2048 Secure Server CA
-=========================================
------BEGIN CERTIFICATE-----
-MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
-ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
-bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
-BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
-NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
-d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
-MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
-ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
-Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
-hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
-nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
-VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
-AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
-gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
-AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
-oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
-o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
-2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
-OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
------END CERTIFICATE-----
-
-Baltimore CyberTrust Root
-=========================
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
-ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
-ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
-SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
-dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
-uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
-UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
-G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
-XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
-l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
-VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
-BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
-cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
-hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
-Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
-RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
------END CERTIFICATE-----
-
-Equifax Secure Global eBusiness CA
-==================================
------BEGIN CERTIFICATE-----
-MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
-bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
-HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
-b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
-PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
-qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
-hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
-BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
-MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
-I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
-NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
------END CERTIFICATE-----
-
-Equifax Secure eBusiness CA 1
-=============================
------BEGIN CERTIFICATE-----
-MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
-LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
-ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
-IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
-1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
-IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
-MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
-Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
-AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
-lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
-KpYrtWKmpj29f5JZzVoqgrI3eQ==
------END CERTIFICATE-----
-
-Equifax Secure eBusiness CA 2
-=============================
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
-ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
-MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
-DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
-2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
-BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
-A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
-JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
-A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
-uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
-Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
-jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
-78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
-V+GRMOrN
------END CERTIFICATE-----
-
-AddTrust Low-Value Services Root
-================================
------BEGIN CERTIFICATE-----
-MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
-cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
-CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
-ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
-54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
-oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
-Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
-GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
-HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
-AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
-HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
-ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
-iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
-eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
-mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
-ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
------END CERTIFICATE-----
-
-AddTrust External Root
-======================
------BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
-VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
-NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
-cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
-Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
-+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
-Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
-aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
-2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
-7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
-BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
-VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
-VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
-IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
-j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
-6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
-e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
-G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
------END CERTIFICATE-----
-
-AddTrust Public Services Root
-=============================
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
-cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
-BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
-dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
-nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
-d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
-Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
-HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
-A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
-FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
-A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
-JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
-+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
-GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
-Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
-EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
------END CERTIFICATE-----
-
-AddTrust Qualified Certificates Root
-====================================
------BEGIN CERTIFICATE-----
-MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
-cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
-CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
-IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
-64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
-KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
-L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
-wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
-MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
-BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
-azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
-ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
-GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
-dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
-RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
-iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
------END CERTIFICATE-----
-
-Entrust Root Certification Authority
-====================================
------BEGIN CERTIFICATE-----
-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
-BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
-b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
-A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
-MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
-MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
-Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
-dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
-A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
-Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
-j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
-rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
-DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
-MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
-hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
-A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
-Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
-v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
-W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
-tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
------END CERTIFICATE-----
-
-RSA Security 2048 v3
-====================
------BEGIN CERTIFICATE-----
-MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
-ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
-MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
-BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
-Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
-WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
-KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
-+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
-MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
-FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
-v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
-0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
-VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
-nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
-pKnXwiJPZ9d37CAFYd4=
------END CERTIFICATE-----
-
-GeoTrust Global CA
-==================
------BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
-Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
-MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
-LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
-BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
-8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
-T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
-vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
-AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
-DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
-zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
-d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
-mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
-XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
-Mw==
------END CERTIFICATE-----
-
-GeoTrust Global CA 2
-====================
------BEGIN CERTIFICATE-----
-MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
-MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
-LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
-NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
-LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
-Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
-HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
-K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
-srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
-ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
-OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
-x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
-H4z1Ir+rzoPz4iIprn2DQKi6bA==
------END CERTIFICATE-----
-
-GeoTrust Universal CA
-=====================
------BEGIN CERTIFICATE-----
-MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
-MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
-Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
-JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
-RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
-7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
-8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
-qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
-Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
-Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
-KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
-ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
-XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
-hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
-aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
-qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
-oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
-xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
-KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
-DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
-xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
-p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
-P/rmMuGNG2+k5o7Y+SlIis5z/iw=
------END CERTIFICATE-----
-
-GeoTrust Universal CA 2
-=======================
------BEGIN CERTIFICATE-----
-MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
-MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
-SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
-DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
-j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
-JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
-QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
-WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
-20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
-ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
-SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
-8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
-+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
-BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
-dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
-4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
-mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
-A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
-Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
-pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
-FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
-gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
-X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
------END CERTIFICATE-----
-
-America Online Root Certification Authority 1
-=============================================
------BEGIN CERTIFICATE-----
-MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
-A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
-T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
-v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
-DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
-sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
-8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
-AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
-o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
-GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
-VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
-3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
-Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
-sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
------END CERTIFICATE-----
-
-America Online Root Certification Authority 2
-=============================================
------BEGIN CERTIFICATE-----
-MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
-A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
-T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
-fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
-f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
-qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
-RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
-gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
-6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
-FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
-Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
-B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
-aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
-AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
-T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
-+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
-JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
-zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
-ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
-1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
-GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
-Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
-cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
------END CERTIFICATE-----
-
-Visa eCommerce Root
-===================
------BEGIN CERTIFICATE-----
-MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
-EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
-QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
-WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
-VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
-bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
-F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
-RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
-TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
-/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
-GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
-MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
-CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
-YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
-zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
-YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
-398znM/jra6O1I7mT1GvFpLgXPYHDw==
------END CERTIFICATE-----
-
-TC TrustCenter, Germany, Class 2 CA
-===================================
------BEGIN CERTIFICATE-----
-MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI
-EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
-U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD
-bGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05
-ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt
-YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy
-aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg
-MiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI
-hvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLs
-qh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5N
-u6hLVxa8/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB
-Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy
-LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBAIRS+yjf
-/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ2
-9ELw+HkuCkhcq8xRT3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac
-ASZ4smZHcFFk
------END CERTIFICATE-----
-
-TC TrustCenter, Germany, Class 3 CA
-===================================
------BEGIN CERTIFICATE-----
-MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI
-EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
-U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD
-bGFzcyAzIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05
-ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt
-YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy
-aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg
-MyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI
-hvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN
-2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+7
-7uMMfTDWw1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB
-Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy
-LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBABY9xs3B
-u4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm
-5gZOngylerpuw3yCGdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS
-CdS7kjXvD9s0
------END CERTIFICATE-----
-
-Certum Root CA
-==============
------BEGIN CERTIFICATE-----
-MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
-ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
-Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
-by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
-wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
-kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
-89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
-Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
-NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
-hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
-GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
-GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
-0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
-qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
------END CERTIFICATE-----
-
-Comodo AAA Services root
-========================
------BEGIN CERTIFICATE-----
-MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
-MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
-c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
-BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
-C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
-i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
-Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
-Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
-Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
-BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
-cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
-LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
-7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
-Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
-8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
-12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
------END CERTIFICATE-----
-
-Comodo Secure Services root
-===========================
------BEGIN CERTIFICATE-----
-MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
-MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
-Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
-BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
-9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
-rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
-oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
-p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
-FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
-gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
-YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
-aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
-4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
-Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
-DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
-pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
-RR3B7Hzs/Sk=
------END CERTIFICATE-----
-
-Comodo Trusted Services root
-============================
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
-MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
-bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
-IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
-3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
-/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
-juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
-ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
-DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
-ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
-cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
-uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
-pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
-BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
-R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
-9y5Xt5hwXsjEeLBi
------END CERTIFICATE-----
-
-QuoVadis Root CA
-================
------BEGIN CERTIFICATE-----
-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
-ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
-MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
-cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
-EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
-J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
-F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
-YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
-AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
-PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
-ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
-MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
-YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
-ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
-Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
-Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
-BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
-FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
-tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
-fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
-LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
-gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
-5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
-5nrQNiOKSnQ2+Q==
------END CERTIFICATE-----
-
-QuoVadis Root CA 2
-==================
------BEGIN CERTIFICATE-----
-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
-EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
-ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
-DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
-XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
-lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
-lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
-lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
-66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
-wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
-D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
-BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
-J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
-DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
-a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
-ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
-Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
-UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
-VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
-+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
-IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
-WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
-f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
-4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
-VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
------END CERTIFICATE-----
-
-QuoVadis Root CA 3
-==================
------BEGIN CERTIFICATE-----
-MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
-EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
-OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
-DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
-DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
-KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
-DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
-BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
-p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
-nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
-MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
-Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
-uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
-BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
-YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
-aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
-BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
-VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
-ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
-AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
-qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
-hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
-POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
-Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
-8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
-bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
-g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
-vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
-qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
------END CERTIFICATE-----
-
-Security Communication Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
-U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
-HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
-U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
-8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
-DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
-5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
-DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
-JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
-DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
-0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
-mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
-s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
-6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
-FL39vmwLAw==
------END CERTIFICATE-----
-
-Sonera Class 2 Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
-U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
-NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
-IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
-/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
-dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
-f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
-tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
-nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
-XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
-0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
-cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
-Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
-EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
-llpwrN9M
------END CERTIFICATE-----
-
-Staat der Nederlanden Root CA
-=============================
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
-ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
-HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
-bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
-vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
-jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
-C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
-vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
-22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
-HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
-dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
-BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
-EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
-MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
-nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
-iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
------END CERTIFICATE-----
-
-TDC Internet Root CA
-====================
------BEGIN CERTIFICATE-----
-MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
-ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
-NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
-ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
-xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
-znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
-5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
-otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
-AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
-VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
-MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
-AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
-UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
-CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
-gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
-2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
-O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
-Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
------END CERTIFICATE-----
-
-TDC OCES Root CA
-================
------BEGIN CERTIFICATE-----
-MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE
-ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5
-MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH
-nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0
-zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV
-iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde
-dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO
-3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB
-5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k
-ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm
-cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp
-Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
-LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM
-MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
-aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
-MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647
-+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6
-NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4
-A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc
-A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9
-AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1
-AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==
------END CERTIFICATE-----
-
-UTN DATACorp SGC Root CA
-========================
------BEGIN CERTIFICATE-----
-MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
-BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
-MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
-HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
-dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
-raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
-wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
-9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
-33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
-DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
-BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
-LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
-DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
-Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
-I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
-EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
-DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
------END CERTIFICATE-----
-
-UTN USERFirst Hardware Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
-BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
-OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
-eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
-ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
-wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
-tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
-i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
-Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
-gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
-lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
-UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
-BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
-//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
-XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
-lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
-iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
-nfhmqA==
------END CERTIFICATE-----
-
-Camerfirma Chambers of Commerce Root
-====================================
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
-QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
-ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
-NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
-cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
-MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
-AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
-xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
-NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
-DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
-d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
-EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
-cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
-AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
-bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
-VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
-aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
-fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
-L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
-UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
-ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
-erfutGWaIZDgqtCYvDi1czyL+Nw=
------END CERTIFICATE-----
-
-Camerfirma Global Chambersign Root
-==================================
------BEGIN CERTIFICATE-----
-MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
-QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
-ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
-NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
-YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
-MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
-ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
-1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
-by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
-6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
-8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
-BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
-aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
-Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
-aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
-ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
-bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
-PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
-gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
-PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
-IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
-t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
------END CERTIFICATE-----
-
-NetLock Notary (Class A) Root
-=============================
------BEGIN CERTIFICATE-----
-MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
-EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
-dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
-ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
-DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
-EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
-VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
-cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
-D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
-z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
-/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
-tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
-4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
-A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
-Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
-bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
-IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
-LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
-ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
-IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
-IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
-b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
-bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
-Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
-bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
-ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
-ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
-CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
-KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
-8CgHrTwXZoi1/baI
------END CERTIFICATE-----
-
-NetLock Business (Class B) Root
-===============================
------BEGIN CERTIFICATE-----
-MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
-VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
-VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
-bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
-VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
-iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
-o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
-1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
-HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
-RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
-dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
-ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
-c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
-YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
-c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
-Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
-bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
-IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
-YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
-cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
-43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
-stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
------END CERTIFICATE-----
-
-NetLock Express (Class C) Root
-==============================
------BEGIN CERTIFICATE-----
-MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
-KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
-BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
-dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
-ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
-jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
-W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
-euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
-DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
-RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
-YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
-IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
-aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
-ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
-ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
-dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
-emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
-IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
-UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
-YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
-xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
-gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
------END CERTIFICATE-----
-
-XRamp Global CA Root
-====================
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
-BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
-dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
-HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
-U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
-IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
-foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
-zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
-AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
-xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
-oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
-AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
-/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
-qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
-nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
-8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
------END CERTIFICATE-----
-
-Go Daddy Class 2 CA
-===================
------BEGIN CERTIFICATE-----
-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
-VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
-A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
-RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
-ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
-2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
-qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
-YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
-vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
-BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
-atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
-MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
-A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
-PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
-I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
-HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
-Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
-vZ8=
------END CERTIFICATE-----
-
-Starfield Class 2 CA
-====================
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
-U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
-MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
-A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
-SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
-bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
-JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
-epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
-F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
-MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
-hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
-bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
-afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
-PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
-xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
-KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
-QBFGmh95DmK/D5fs4C8fF5Q=
------END CERTIFICATE-----
-
-StartCom Certification Authority
-================================
------BEGIN CERTIFICATE-----
-MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
-U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
-ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
-NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
-LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
-U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
-ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
-o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
-Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
-eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
-2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
-6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
-osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
-untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
-UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
-37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
-FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
-Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
-YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
-AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
-Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
-U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
-LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
-cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
-dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
-AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
-3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
-vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
-fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
-fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
-EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
-yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
-1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
-lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
-g14=
------END CERTIFICATE-----
-
-Taiwan GRCA
-===========
------BEGIN CERTIFICATE-----
-MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
-EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
-DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
-dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
-w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
-BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
-1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
-htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
-J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
-Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
-B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
-O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
-lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
-HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
-09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
-TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
-Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
-Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
-D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
-DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
-Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
-7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
-CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
-+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
------END CERTIFICATE-----
-
-Firmaprofesional Root CA
-========================
------BEGIN CERTIFICATE-----
-MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
-GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
-Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
-ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
-MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
-OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
-ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
-j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
-lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
-3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
-NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
-KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
-AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
-DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
-ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
-u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
-wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
-7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
-VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
------END CERTIFICATE-----
-
-Wells Fargo Root CA
-===================
------BEGIN CERTIFICATE-----
-MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
-BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
-MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
-bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
-MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
-x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
-E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
-OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
-sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
-YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
-BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
-ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
-m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
-OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
-x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
-tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
------END CERTIFICATE-----
-
-Swisscom Root CA 1
-==================
------BEGIN CERTIFICATE-----
-MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
-EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
-dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
-MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
-aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
-IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
-MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
-NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
-AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
-b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
-7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
-cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
-WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
-haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
-MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
-HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
-BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
-MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
-jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
-MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
-VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
-vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
-OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
-1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
-nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
-x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
-NY6E0F/6MBr1mmz0DlP5OlvRHA==
------END CERTIFICATE-----
-
-DigiCert Assured ID Root CA
-===========================
------BEGIN CERTIFICATE-----
-MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
-IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
-MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
-ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
-9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
-UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
-/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
-oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
-GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
-66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
-hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
-EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
-SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
-8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
-+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
------END CERTIFICATE-----
-
-DigiCert Global Root CA
-=======================
------BEGIN CERTIFICATE-----
-MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
-HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
-MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
-dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
-TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
-BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
-4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
-7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
-o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
-8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
-BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
-EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
-tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
-UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
-CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
------END CERTIFICATE-----
-
-DigiCert High Assurance EV Root CA
-==================================
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
-KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
-MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
-MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
-Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
-Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
-OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
-MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
-NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
-h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
-Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
-JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
-V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
-myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
-mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
-vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
------END CERTIFICATE-----
-
-Certplus Class 2 Primary CA
-===========================
------BEGIN CERTIFICATE-----
-MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
-BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
-OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
-dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
-5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
-Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
-YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
-e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
-CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
-YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
-L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
-P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
-TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
-7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
-//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
-l7+ijrRU
------END CERTIFICATE-----
-
-DST Root CA X3
-==============
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
-ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
-DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
-cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
-rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
-UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
-xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
-utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
-MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
-dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
-GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
-RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
-fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
-
-DST ACES CA X6
-==============
------BEGIN CERTIFICATE-----
-MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
-MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
-MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
-CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
-DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
-pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
-GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
-MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
-EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
-Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
-dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
-CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
-5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
-Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
-nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
-vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
-oKfN5XozNmr6mis=
------END CERTIFICATE-----
-
-TURKTRUST Certificate Services Provider Root 1
-==============================================
------BEGIN CERTIFICATE-----
-MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
-MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
-acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
-MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
-U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
-TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
-aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
-yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
-Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
-8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
-W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
-BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
-sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
-q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
-B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
-nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
------END CERTIFICATE-----
-
-TURKTRUST Certificate Services Provider Root 2
-==============================================
------BEGIN CERTIFICATE-----
-MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
-MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
-QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
-MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
-dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
-A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
-acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
-LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
-x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
-QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
-5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
-AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
-Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
-Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
-hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
-9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
-UrbnBEI=
------END CERTIFICATE-----
-
-SwissSign Gold CA - G2
-======================
------BEGIN CERTIFICATE-----
-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
-EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
-MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
-c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
-t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
-jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
-vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
-ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
-AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
-jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
-peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
-7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
-GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
-OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
-L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
-5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
-44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
-Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
-Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
-mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
-vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
-KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
-NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
-viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
------END CERTIFICATE-----
-
-SwissSign Silver CA - G2
-========================
------BEGIN CERTIFICATE-----
-MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
-BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
-DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
-aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
-9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
-N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
-+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
-6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
-MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
-qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
-FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
-ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
-celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
-CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
-tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
-cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
-4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
-kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
-3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
-/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
-DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
-e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
-WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
-DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
-DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority
-========================================
------BEGIN CERTIFICATE-----
-MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
-CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
-cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
-b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
-nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
-RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
-tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
-AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
-hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
-Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
-NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
-Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
-1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
------END CERTIFICATE-----
-
-thawte Primary Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
-BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
-aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
-MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
-SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
-KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
-FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
-oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
-1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
-q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
-aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
-afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
-AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
-uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
-xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
-jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
-z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
------END CERTIFICATE-----
-
-VeriSign Class 3 Public Primary Certification Authority - G5
-============================================================
------BEGIN CERTIFICATE-----
-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
-ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
-IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
-biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
-dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
-YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
-j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
-Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
-Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
-fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
-BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
-Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
-aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
-SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
-X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
-KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
-Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
-ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
------END CERTIFICATE-----
-
-SecureTrust CA
-==============
------BEGIN CERTIFICATE-----
-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
-dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
-BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
-OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
-DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
-GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
-01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
-ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
-aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
-KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
-SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
-mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
-nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
-3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
------END CERTIFICATE-----
-
-Secure Global CA
-================
------BEGIN CERTIFICATE-----
-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
-bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
-MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
-Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
-YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
-bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
-8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
-HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
-0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
-oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
-MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
-OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
-CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
-3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
-f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
------END CERTIFICATE-----
-
-COMODO Certification Authority
-==============================
------BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
-BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
-A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
-MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
-T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
-+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
-xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
-4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
-1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
-rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
-b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
-AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
-OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
-IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
-+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
------END CERTIFICATE-----
-
-Network Solutions Certificate Authority
-=======================================
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
-EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
-IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
-MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
-jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
-aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
-crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
-/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
-AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
-bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
-A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
-4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
-GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
-ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
------END CERTIFICATE-----
-
-WellsSecure Public Root Certificate Authority
-=============================================
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
-F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
-NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
-MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
-bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
-VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
-iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
-i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
-bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
-K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
-AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
-cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
-lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
-i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
-GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
-Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
-K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
-bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
-qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
-E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
-tylv2G0xffX8oRAHh84vWdw+WNs=
------END CERTIFICATE-----
-
-COMODO ECC Certification Authority
-==================================
------BEGIN CERTIFICATE-----
-MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
-R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
-ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
-GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
-Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
-4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
-wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
-FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
-U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
------END CERTIFICATE-----
-
-IGC/A
-=====
------BEGIN CERTIFICATE-----
-MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
-VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
-Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
-MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
-EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
-STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
-TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
-So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
-HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
-frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
-tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
-egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
-iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
-q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
-MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
-Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
-lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
-0mBWWg==
------END CERTIFICATE-----
-
-Security Communication EV RootCA1
-=================================
------BEGIN CERTIFICATE-----
-MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
-U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
-dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
-BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
-Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
-/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
-WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
-ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
-bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
-9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
-SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
-iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
-Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
-mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
-T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
------END CERTIFICATE-----
-
-OISTE WISeKey Global Root GA CA
-===============================
------BEGIN CERTIFICATE-----
-MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
-BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
-A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
-bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
-VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
-IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
-IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
-Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
-Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
-d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
-/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
-LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
-KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
-MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
-+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
-hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
-okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
------END CERTIFICATE-----
-
-Microsec e-Szigno Root CA
-=========================
------BEGIN CERTIFICATE-----
-MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
-BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
-EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
-MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
-dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
-GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
-d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
-oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
-QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
-PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
-MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
-IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
-VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
-LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
-dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
-AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
-4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
-AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
-egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
-Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
-PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
-c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
-cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
-IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
-WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
-MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
-MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
-Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
-HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
-nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
-aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
-86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
-yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
-S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
------END CERTIFICATE-----
-
-Certigna
-========
------BEGIN CERTIFICATE-----
-MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
-EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
-MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
-Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
-XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
-GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
-ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
-DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
-Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
-tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
-BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
-SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
-hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
-ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
-PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
-1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
-WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
------END CERTIFICATE-----
-
-AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
-======================================
------BEGIN CERTIFICATE-----
-MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
-AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
-LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
-HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
-U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
-IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
-yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
-2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
-4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
-2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
-8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
-HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
-Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
-5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
-czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
-AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
-ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
-BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
-cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
-AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
-EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
-/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
-MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
-3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
-eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
-/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
-RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
-Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
------END CERTIFICATE-----
-
-TC TrustCenter Class 2 CA II
-============================
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
-IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
-MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
-c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
-AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
-IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
-xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
-Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
-SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
-7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
-Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
-cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
-SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
-dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
-KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
-TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
-JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
-vQ==
------END CERTIFICATE-----
-
-TC TrustCenter Class 3 CA II
-============================
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
-IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
-MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
-c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
-AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
-yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
-6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
-uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
-2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
-7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
-Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
-cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
-SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
-O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
-yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
-IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
-092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
-5A==
------END CERTIFICATE-----
-
-TC TrustCenter Universal CA I
-=============================
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
-IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
-MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
-VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
-JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
-qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
-xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
-ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
-gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
-BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
-1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
-vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
-ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
-ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
-7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
------END CERTIFICATE-----
-
-Deutsche Telekom Root CA 2
-==========================
------BEGIN CERTIFICATE-----
-MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
-RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
-A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
-MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
-A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
-b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
-bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
-KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
-AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
-Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
-jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
-HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
-E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
-zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
-rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
-dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
-Cm26OWMohpLzGITY+9HPBVZkVw==
------END CERTIFICATE-----
-
-ComSign Secured CA
-==================
------BEGIN CERTIFICATE-----
-MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
-AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
-NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
-QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
-49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
-7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
-kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
-9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
-AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
-U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
-j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
-AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
-BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
-FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
-51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
-OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
------END CERTIFICATE-----
-
-Cybertrust Global Root
-======================
------BEGIN CERTIFICATE-----
-MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
-ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
-MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
-ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
-0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
-AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
-89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
-8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
-MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
-A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
-lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
-5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
-hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
-X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
-WL1WMRJOEcgh4LMRkWXbtKaIOM5V
------END CERTIFICATE-----
-
-ePKI Root Certification Authority
-=================================
------BEGIN CERTIFICATE-----
-MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
-EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
-MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
-MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
-IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
-lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
-qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
-12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
-WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
-ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
-lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
-vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
-Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
-MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
-ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
-1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
-KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
-xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
-NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
-GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
-xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
-gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
-sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
-BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
------END CERTIFICATE-----
-
-T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
-=============================================================================================================================
------BEGIN CERTIFICATE-----
-MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
-DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
-aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
-b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
-BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
-S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
-MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
-IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
-n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
-IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
-dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
-cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
-Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
-xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
-6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
-hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
-BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
-MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
-N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
-y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
-LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
-dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
------END CERTIFICATE-----
-
-Buypass Class 2 CA 1
-====================
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
-MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
-c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
-cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
-0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
-0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
-uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
-AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
-1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
-7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
-fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
-wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
------END CERTIFICATE-----
-
-Buypass Class 3 CA 1
-====================
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
-MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
-c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
-ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
-n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
-AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
-1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
-AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
-pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
-EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
-htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
-el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
------END CERTIFICATE-----
-
-EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
-==========================================================================
------BEGIN CERTIFICATE-----
-MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
-QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
-Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
-ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
-IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
-X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
-gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
-eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
-TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
-Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
-uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
-qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
-ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
-Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
-/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
-Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
-FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
-zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
-XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
-bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
-RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
-1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
-2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
-Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
-AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
------END CERTIFICATE-----
-
-certSIGN ROOT CA
-================
------BEGIN CERTIFICATE-----
-MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
-VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
-Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
-CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
-JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
-rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
-ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
-0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
-AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
-Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
-AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
-SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
-x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
-vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
-TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
------END CERTIFICATE-----
-
-CNNIC ROOT
-==========
------BEGIN CERTIFICATE-----
-MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
-ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
-OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
-o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
-VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
-VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
-czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
-y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
-wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
-lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
-Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
-O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
-BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
-G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
-mxE=
------END CERTIFICATE-----
-
-ApplicationCA - Japanese Government
-===================================
------BEGIN CERTIFICATE-----
-MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
-SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
-MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
-cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
-fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
-wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
-jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
-nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
-WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
-BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
-vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
-o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
-/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
-io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
-dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
-rosot4LKGAfmt1t06SAZf7IbiVQ=
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority - G3
-=============================================
------BEGIN CERTIFICATE-----
-MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
-BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
-IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
-NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
-YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
-LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
-K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
-c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
-IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
-dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
-2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
-cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
-Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
-AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
-t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
------END CERTIFICATE-----
-
-thawte Primary Root CA - G2
-===========================
------BEGIN CERTIFICATE-----
-MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
-VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
-IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
-Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
-MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
-b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
-IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
-LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
-8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
-mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
-G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
-rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
------END CERTIFICATE-----
-
-thawte Primary Root CA - G3
-===========================
------BEGIN CERTIFICATE-----
-MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
-BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
-aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
-ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
-d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
-VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
-A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
-P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
-+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
-7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
-vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
-KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
-A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
-t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
-8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
-er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority - G2
-=============================================
------BEGIN CERTIFICATE-----
-MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
-Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
-OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
-MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
-b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
-BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
-KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
-EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
-ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
-npaqBA+K
------END CERTIFICATE-----
-
-VeriSign Universal Root Certification Authority
-===============================================
------BEGIN CERTIFICATE-----
-MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
-ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
-IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
-IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
-1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
-MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
-9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
-AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
-tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
-CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
-a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
-DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
-Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
-Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
-P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
-wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
-mJO37M2CYfE45k+XmCpajQ==
------END CERTIFICATE-----
-
-VeriSign Class 3 Public Primary Certification Authority - G4
-============================================================
------BEGIN CERTIFICATE-----
-MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
-VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
-b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
-ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
-cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
-b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
-Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
-rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
-HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
-Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
-A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
-AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
------END CERTIFICATE-----
-
-NetLock Arany (Class Gold) Főtanúsítvány
-============================================
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
-A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
-dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
-cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
-MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
-ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
-biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
-c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
-0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
-/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
-H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
-fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
-neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
-qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
-YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
-bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
-NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
-dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
------END CERTIFICATE-----
-
-Staat der Nederlanden Root CA - G2
-==================================
------BEGIN CERTIFICATE-----
-MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
-CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
-TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
-ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
-5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
-vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
-CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
-e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
-OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
-CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
-48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
-trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
-qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
-AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
-ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
-A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
-+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
-f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
-kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
-CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
-URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
-CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
-oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
-IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
-66+KAQ==
------END CERTIFICATE-----
-
-CA Disig
-========
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
-QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
-MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
-bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
-GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
-Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
-hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
-ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
-gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
-AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
-aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
-ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
-BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
-WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
-mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
-CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
-ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
-4Z7CRneC9VkGjCFMhwnN5ag=
------END CERTIFICATE-----
-
-Juur-SK
-=======
------BEGIN CERTIFICATE-----
-MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
-c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
-DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
-SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
-aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
-TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
-+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
-UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
-Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
-MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
-HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
-AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
-cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
-AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
-cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
-FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
-A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
-ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
-abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
-IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
-Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
-yyqcjg==
------END CERTIFICATE-----
-
-Hongkong Post Root CA 1
-=======================
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
-DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
-NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
-IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
-ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
-auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
-qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
-V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
-HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
-h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
-l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
-IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
-T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
-c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
------END CERTIFICATE-----
-
-SecureSign RootCA11
-===================
------BEGIN CERTIFICATE-----
-MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
-SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
-b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
-KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
-cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
-TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
-wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
-g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
-O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
-bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
-t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
-OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
-bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
-Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
-y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
-lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
------END CERTIFICATE-----
-
-ACEDICOM Root
-=============
------BEGIN CERTIFICATE-----
-MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
-T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
-MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
-A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
-WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
-YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
-MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
-m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
-HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
-xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
-3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
-2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
-TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
-4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
-9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
-bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
-aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
-eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
-zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
-ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
-KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
-nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
-I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
-MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
-tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
-f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
-hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
-CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
-bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
-D/xwzoiQ
------END CERTIFICATE-----
-
-Microsec e-Szigno Root CA 2009
-==============================
------BEGIN CERTIFICATE-----
-MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
-MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
-c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
-dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
-BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
-U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
-fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
-0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
-pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
-1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
-AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
-QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
-FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
-lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
-I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
-tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
-yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
-LXpUq3DDfSJlgnCW
------END CERTIFICATE-----
-
-E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
-===================================================
------BEGIN CERTIFICATE-----
-MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
-EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
-ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
-MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
-cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
-aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
-8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
-jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
-JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
-9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
-SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
-F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
-D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
-Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
-fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
------END CERTIFICATE-----
-
-GlobalSign Root CA - R3
-=======================
------BEGIN CERTIFICATE-----
-MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
-YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
-bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
-aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
-bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
-iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
-0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
-rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
-OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
-xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
-FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
-lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
-EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
-bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
-YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
-kpeDMdmztcpHWD9f
------END CERTIFICATE-----
-
-TC TrustCenter Universal CA III
-===============================
------BEGIN CERTIFICATE-----
-MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
-IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
-Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
-QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
-KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
-QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
-juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
-CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
-M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
-A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
-g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
-KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
-BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
-CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
-woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
------END CERTIFICATE-----
-
-Autoridad de Certificacion Firmaprofesional CIF A62634068
-=========================================================
------BEGIN CERTIFICATE-----
-MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
-BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
-MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
-QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
-NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
-Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
-B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
-7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
-ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
-plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
-MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
-LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
-bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
-vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
-EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
-DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
-cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
-bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
-ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
-51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
-R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
-T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
-Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
-osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
-crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
-saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
-KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
-6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
------END CERTIFICATE-----
-
-Izenpe.com
-==========
------BEGIN CERTIFICATE-----
-MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
-EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
-MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
-QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
-03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
-ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
-+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
-PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
-OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
-F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
-0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
-0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
-leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
-AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
-SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
-NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
-MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
-BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
-Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
-kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
-hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
-g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
-aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
-nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
-ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
-Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
-WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
------END CERTIFICATE-----
-
-Chambers of Commerce Root - 2008
-================================
------BEGIN CERTIFICATE-----
-MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
-MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
-bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
-QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
-Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
-ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
-EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
-cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
-XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
-h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
-ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
-NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
-D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
-lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
-0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
-ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
-EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
-G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
-BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
-bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
-bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
-CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
-AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
-wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
-3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
-RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
-M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
-YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
-9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
-zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
-nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
-OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
------END CERTIFICATE-----
-
-Global Chambersign Root - 2008
-==============================
------BEGIN CERTIFICATE-----
-MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
-MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
-bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
-QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
-NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
-Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
-QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
-aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
-VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
-XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
-ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
-/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
-TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
-H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
-Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
-HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
-wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
-AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
-BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
-BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
-aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
-aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
-1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
-dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
-/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
-ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
-dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
-9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
-foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
-qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
-P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
-c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
-09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
------END CERTIFICATE-----
-
-Go Daddy Root Certificate Authority - G2
-========================================
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
-MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
-MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
-b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
-A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
-9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
-+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
-fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
-NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
-BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
-vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
-5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
-N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
-LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
------END CERTIFICATE-----
-
-Starfield Root Certificate Authority - G2
-=========================================
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
-b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
-eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
-DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
-VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
-dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
-W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
-bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
-N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
-ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
-JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
-TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
-4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
-F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
-pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
-c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
------END CERTIFICATE-----
-
-Starfield Services Root Certificate Authority - G2
-==================================================
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
-b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
-IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
-BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
-dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
-Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
-h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
-hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
-LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
-rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
-SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
-E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
-xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
-iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
-YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
------END CERTIFICATE-----
-
-AffirmTrust Commercial
-======================
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
-MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
-bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
-DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
-C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
-BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
-MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
-HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
-hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
-qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
-0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
-sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
------END CERTIFICATE-----
-
-AffirmTrust Networking
-======================
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
-MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
-bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
-Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
-dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
-/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
-h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
-HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
-UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
-12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
-WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
-/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
------END CERTIFICATE-----
-
-AffirmTrust Premium
-===================
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
-OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
-dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
-MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
-BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
-5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
-+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
-GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
-p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
-S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
-6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
-/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
-+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
-MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
-Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
-6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
-L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
-+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
-BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
-IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
-g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
-zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
------END CERTIFICATE-----
-
-AffirmTrust Premium ECC
-=======================
------BEGIN CERTIFICATE-----
-MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
-BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
-MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
-cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
-N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
-BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
-BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
-57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
-eQ==
------END CERTIFICATE-----
-
-Certum Trusted Network CA
-=========================
------BEGIN CERTIFICATE-----
-MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
-ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
-MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
-ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
-l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
-J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
-fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
-cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
-Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
-DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
-jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
-mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
-Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
-03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
------END CERTIFICATE-----
-
-Certinomis - Autorité Racine
-=============================
------BEGIN CERTIFICATE-----
-MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
-Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
-LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
-A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
-JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
-wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
-Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
-2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
-jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
-c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
-lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
-xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
-530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
-4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
-KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
-WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
-R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
-nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
-CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
-JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
-qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
-WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
-wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
-vgt2Fl43N+bYdJeimUV5
------END CERTIFICATE-----
-
-Root CA Generalitat Valenciana
-==============================
------BEGIN CERTIFICATE-----
-MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
-ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
-IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
-WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
-CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
-F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
-ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
-D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
-JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
-AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
-dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
-ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
-AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
-YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
-AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
-aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
-AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
-YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
-AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
-OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
-dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
-BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
-A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
-b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
-TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
-Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
-NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
-iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
-+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
------END CERTIFICATE-----
-
-A-Trust-nQual-03
-================
------BEGIN CERTIFICATE-----
-MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
-Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
-a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
-dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
-RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
-ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
-c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
-zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
-yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
-SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
-iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
-cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
-eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
-ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
-sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
-JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
-mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
-ahq97BvIxYSazQ==
------END CERTIFICATE-----
-
-TWCA Root Certification Authority
-=================================
------BEGIN CERTIFICATE-----
-MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
-VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
-EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
-IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
-QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
-oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
-4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
-y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
-9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
-mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
-QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
-T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
-Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
------END CERTIFICATE-----
+
+
+
##
+## ca-bundle.crt -- Bundle of CA Root Certificates
+##
+## Certificate data from Mozilla as of: Thu Nov  3 19:04:19 2011
+##
+## This is a bundle of X.509 certificates of public Certificate Authorities
+## (CA). These were automatically extracted from Mozilla's root certificates
+## file (certdata.txt).  This file can be found in the mozilla source tree:
+## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
+##
+## It contains the certificates in PEM format and therefore
+## can be directly used with curl / libcurl / php_curl, or with
+## an Apache+mod_ssl webserver for SSL client authentication.
+## Just configure this file as the SSLCACertificateFile.
+##
+
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is the Netscape security libraries.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1994-2000
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
+
+GTE CyberTrust Global Root
+==========================
+-----BEGIN CERTIFICATE-----
+MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
+Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
+A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
+MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
+Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
+IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
+sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
+HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
+AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
+M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
+NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
+-----END CERTIFICATE-----
+
+Thawte Server CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
+dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
+AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
+b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
+BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
+c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
+A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
+ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
+/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
+1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
+GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
+GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
+-----END CERTIFICATE-----
+
+Thawte Premium Server CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
+dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
+AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
+ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
+AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
+VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
+aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
+cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
+aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
+Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
+qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
+SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
+8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
+UCemDaYj+bvLpgcUQg==
+-----END CERTIFICATE-----
+
+Equifax Secure CA
+=================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
+ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
+MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
+B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
+nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
+fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
+8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
+A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
+CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
+A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
+spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
+Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
+zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
+BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
+70+sB3c4
+-----END CERTIFICATE-----
+
+Digital Signature Trust Co. Global CA 1
+=======================================
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
+ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
+MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
+IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
+NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
+o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
+BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
+dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
+IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
+MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
+BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
+ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
+kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
+RbyhkwS7hp86W0N6w4pl
+-----END CERTIFICATE-----
+
+Digital Signature Trust Co. Global CA 3
+=======================================
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
+ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
+MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
+IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
+VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
+xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
+BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
+dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
+IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
+MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
+BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
+AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
+up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
+mPnHfxsb1gYgAlihw6ID
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
+f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
+hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
+TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
+WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
+Tqj/ZA1k
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G2
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
+FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
+lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
+MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
+1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
+Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
+-----END CERTIFICATE-----
+
+Verisign Class 4 Public Primary Certification Authority - G2
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4
+xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDH
+qGKB3FtKqsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQAB
+MA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGIL4LcY/oCRaxF
+WdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0ycyfYaT5DdPauxYma51N86Xv2S/PB
+ZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRPT8qAkbYp
+-----END CERTIFICATE-----
+
+GlobalSign Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
+GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
+b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
+VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
+DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
+THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
+Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
+c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
+gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
+AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
+Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
+j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
+hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
+X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
+ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
+s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
+S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
+TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
+ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
+YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
+BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
+9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
+01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
+9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+ValiCert Class 1 VA
+===================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
+MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
+GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
+DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
+lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
+icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
+Orf1LXLI
+-----END CERTIFICATE-----
+
+ValiCert Class 2 VA
+===================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
+MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
+CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
+ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
+SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
+UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
+W9ViH0Pd
+-----END CERTIFICATE-----
+
+RSA Root Certificate 1
+======================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
+MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
+3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
+BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
+3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
+V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
+on+jjBXu
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
+EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
+cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
+EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
+055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
+j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
+xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
+t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+Verisign Class 4 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
+tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
+8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
+Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
+Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
+mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
+fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
+RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
+UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
+-----END CERTIFICATE-----
+
+Entrust.net Secure Server CA
+============================
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
+BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
+cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
+ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
+A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
+eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
+dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
+aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
+gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
+ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
+CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
+dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
+NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
+HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
+BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
+Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
+n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
+
+Entrust.net Premium 2048 Secure Server CA
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
+NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
+ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
+Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
+hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
+nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
+AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
+gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
+AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
+oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
+o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
+2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
+OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
+-----END CERTIFICATE-----
+
+Baltimore CyberTrust Root
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
+ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
+ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
+SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
+dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
+uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
+UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
+G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
+XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
+l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
+VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
+BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
+cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
+hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
+Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
+RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+Equifax Secure Global eBusiness CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
+bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
+HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
+b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
+PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
+qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
+hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
+BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
+MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
+I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
+NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
+-----END CERTIFICATE-----
+
+Equifax Secure eBusiness CA 1
+=============================
+-----BEGIN CERTIFICATE-----
+MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
+LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
+ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
+IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
+1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
+IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
+MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
+Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
+AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
+lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
+KpYrtWKmpj29f5JZzVoqgrI3eQ==
+-----END CERTIFICATE-----
+
+Equifax Secure eBusiness CA 2
+=============================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
+ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
+MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
+DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
+nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
+2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
+BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
+A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
+JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
+A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
+uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
+Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
+jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
+78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
+V+GRMOrN
+-----END CERTIFICATE-----
+
+AddTrust Low-Value Services Root
+================================
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
+cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
+CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
+ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
+54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
+oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
+Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
+GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
+HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
+AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
+RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
+HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
+ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
+iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
+mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
+ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+
+AddTrust External Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
+VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
+NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
+cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
+Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
+Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
+aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
+2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
+7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
+VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
+VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
+j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
+e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
+G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+AddTrust Public Services Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
+cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
+BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
+dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
+nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
+d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
+Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
+HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
+A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
+A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
+JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
+Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
+EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+AddTrust Qualified Certificates Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
+cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
+CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
+IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
+64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
+KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
+L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
+wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
+MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
+BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
+azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
+GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
+RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
+iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+RSA Security 2048 v3
+====================
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
+ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
+MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
+BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
+Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
+WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
+KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
+FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
+v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
+0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
+VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
+nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
+pKnXwiJPZ9d37CAFYd4=
+-----END CERTIFICATE-----
+
+GeoTrust Global CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
+MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
+BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
+8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
+T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
+vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
+DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
+zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
+d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
+mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
+XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
+Mw==
+-----END CERTIFICATE-----
+
+GeoTrust Global CA 2
+====================
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
+MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
+NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
+LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
+Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
+HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
+K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
+srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
+ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
+OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
+x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
+H4z1Ir+rzoPz4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
+MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
+Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
+JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
+RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
+7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
+8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
+qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
+Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
+Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
+KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
+ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
+XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
+hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
+qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
+oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
+xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
+KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
+DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
+xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
+p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
+P/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA 2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
+MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
+SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
+DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
+j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
+JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
+QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
+WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
+20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
+ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
+SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
+8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
+BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
+4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
+A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
+Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
+pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
+FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
+gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
+X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+America Online Root Certification Authority 1
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
+A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
+T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
+v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
+DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
+sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
+8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
+AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
+o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
+GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
+VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
+3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
+Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
+sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
+-----END CERTIFICATE-----
+
+America Online Root Certification Authority 2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
+A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
+T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
+fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
+f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
+qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
+RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
+gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
+6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
+FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
+Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
+B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
+aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
+T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
+JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
+zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
+ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
+1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
+GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
+Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
+cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
+-----END CERTIFICATE-----
+
+Visa eCommerce Root
+===================
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
+EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
+QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
+WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
+VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
+F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
+RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
+TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
+/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
+GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
+MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
+CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
+YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
+zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
+YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+TC TrustCenter, Germany, Class 2 CA
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI
+EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
+U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD
+bGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05
+ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt
+YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy
+aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg
+MiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI
+hvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLs
+qh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5N
+u6hLVxa8/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB
+Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy
+LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBAIRS+yjf
+/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ2
+9ELw+HkuCkhcq8xRT3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac
+ASZ4smZHcFFk
+-----END CERTIFICATE-----
+
+TC TrustCenter, Germany, Class 3 CA
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI
+EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
+U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD
+bGFzcyAzIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05
+ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt
+YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy
+aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg
+MyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI
+hvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN
+2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+7
+7uMMfTDWw1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB
+Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy
+LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBABY9xs3B
+u4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm
+5gZOngylerpuw3yCGdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS
+CdS7kjXvD9s0
+-----END CERTIFICATE-----
+
+Certum Root CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
+ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
+Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
+by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
+wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
+kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
+89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
+Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
+NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
+hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
+GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
+GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
+0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
+qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
+-----END CERTIFICATE-----
+
+Comodo AAA Services root
+========================
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
+MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
+c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
+C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
+i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
+Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
+Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
+Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
+BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
+cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
+LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
+7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
+8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
+12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+Comodo Secure Services root
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
+MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
+Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
+BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
+9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
+rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
+oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
+p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
+FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
+YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
+aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
+4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
+DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
+pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
+RR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+
+Comodo Trusted Services root
+============================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
+MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
+bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
+IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
+3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
+/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
+juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
+ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
+DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
+ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
+cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
+uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
+BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
+R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
+9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+
+QuoVadis Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
+ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
+MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
+cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
+EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
+J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
+F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
+YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
+AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
+PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
+ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
+MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
+YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
+ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
+Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
+BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
+FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
+tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
+fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
+LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
+gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
+5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
+5nrQNiOKSnQ2+Q==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
+ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
+XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
+lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
+lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
+lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
+66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
+wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
+D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
+BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
+J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
+DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
+a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
+Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
+UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
+VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
+IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
+WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
+f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
+4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
+VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
+OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
+DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
+KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
+DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
+BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
+p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
+nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
+MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
+Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
+uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
+BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
+YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
+BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
+VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
+ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
+AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
+qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
+hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
+POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
+Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
+8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
+bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
+g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
+vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
+qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+Security Communication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
+8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
+DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
+5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
+DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
+JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
+0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
+mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
+s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
+6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
+FL39vmwLAw==
+-----END CERTIFICATE-----
+
+Sonera Class 2 Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
+NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
+IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
+/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
+dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
+f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
+tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
+nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
+XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
+0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
+cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
+Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
+EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
+llpwrN9M
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA
+=============================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
+ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
+HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
+bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
+vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
+jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
+C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
+vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
+22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
+HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
+dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
+BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
+EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
+MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
+nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
+iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
+-----END CERTIFICATE-----
+
+TDC Internet Root CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
+ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
+NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
+ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
+xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
+znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
+5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
+otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
+AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
+VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
+MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
+AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
+UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
+CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
+gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
+O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
+Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
+-----END CERTIFICATE-----
+
+TDC OCES Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE
+ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5
+MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH
+nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0
+zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV
+iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde
+dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO
+3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB
+5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k
+ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm
+cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp
+Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
+LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM
+MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
+aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
+MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647
++RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6
+NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4
+A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc
+A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9
+AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1
+AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==
+-----END CERTIFICATE-----
+
+UTN DATACorp SGC Root CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
+BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
+MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
+HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
+dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
+raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
+wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
+9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
+33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
+DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
+BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
+LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
+DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
+Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
+I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
+EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
+DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
+-----END CERTIFICATE-----
+
+UTN USERFirst Hardware Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
+BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
+OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
+eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
+ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
+wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
+tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
+i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
+Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
+gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
+lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
+UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
+BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
+XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
+lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
+iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
+nfhmqA==
+-----END CERTIFICATE-----
+
+Camerfirma Chambers of Commerce Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
+NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
+cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
+MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
+AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
+xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
+NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
+DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
+d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
+EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
+cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
+AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
+bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
+VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
+fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
+L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
+UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
+ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
+erfutGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+
+Camerfirma Global Chambersign Root
+==================================
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
+NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
+YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
+MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
+ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
+1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
+by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
+6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
+8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
+BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
+aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
+Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
+aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
+ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
+PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
+gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
+PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
+IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
+t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----END CERTIFICATE-----
+
+NetLock Notary (Class A) Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
+EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
+dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
+ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
+DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
+EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
+VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
+cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
+D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
+z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
+/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
+tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
+4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
+A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
+Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
+bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
+IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
+LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
+ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
+IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
+IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
+b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
+bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
+Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
+bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
+ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
+ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
+CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
+KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
+8CgHrTwXZoi1/baI
+-----END CERTIFICATE-----
+
+NetLock Business (Class B) Root
+===============================
+-----BEGIN CERTIFICATE-----
+MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
+VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
+VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
+bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
+VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
+o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
+1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
+HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
+RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
+dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
+ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
+c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
+YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
+c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
+Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
+bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
+IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
+YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
+cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
+43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
+stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
+-----END CERTIFICATE-----
+
+NetLock Express (Class C) Root
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
+KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
+BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
+dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
+ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
+W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
+euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
+DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
+RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
+YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
+IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
+aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
+ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
+ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
+dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
+emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
+IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
+UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
+YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
+xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
+gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
+-----END CERTIFICATE-----
+
+XRamp Global CA Root
+====================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
+BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
+dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
+HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
+U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
+IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
+foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
+zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
+AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
+xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
+oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
+AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
+/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
+nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
+8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+Go Daddy Class 2 CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
+VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
+A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
+ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
+2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
+qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
+YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
+vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
+BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
+atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
+MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
+PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
+I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
+Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
+vZ8=
+-----END CERTIFICATE-----
+
+Starfield Class 2 CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
+U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
+MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
+A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
+SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
+bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
+JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
+epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
+F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
+MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
+hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
+bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
+afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
+PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
+KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
+QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
+YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
+AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
+Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
+U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
+LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
+cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
+dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
+AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
+3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
+vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
+fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
+fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
+EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
+1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
+lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
+g14=
+-----END CERTIFICATE-----
+
+Taiwan GRCA
+===========
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
+EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
+DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
+dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
+w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
+BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
+1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
+htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
+J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
+Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
+B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
+O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
+lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
+HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
+09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
+Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
+Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
+D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
+DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
+Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
+7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
+CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
+-----END CERTIFICATE-----
+
+Firmaprofesional Root CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
+GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
+Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
+ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
+MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
+OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
+ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
+j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
+lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
+3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
+NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
+KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
+AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
+ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
+u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
+wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
+7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
+VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
+-----END CERTIFICATE-----
+
+Wells Fargo Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
+BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
+bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
+MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
+x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
+E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
+OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
+sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
+YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
+BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
+ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
+m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
+OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
+x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
+tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
+-----END CERTIFICATE-----
+
+Swisscom Root CA 1
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
+MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
+MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
+NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
+AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
+b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
+7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
+cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
+WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
+haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
+MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
+BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
+MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
+jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
+MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
+VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
+vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
+OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
+1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
+nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
+x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
+NY6E0F/6MBr1mmz0DlP5OlvRHA==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+DigiCert Global Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+DigiCert High Assurance EV Root CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
+-----END CERTIFICATE-----
+
+Certplus Class 2 Primary CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
+BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
+OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
+dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
+5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
+Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
+YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
+e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
+CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
+YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
+L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
+P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
+TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
+7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
+//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+DST Root CA X3
+==============
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
+ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
+DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
+cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
+rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
+UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
+xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
+utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
+MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
+dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
+GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
+RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
+fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+DST ACES CA X6
+==============
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
+MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
+MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
+CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
+DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
+pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
+GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
+MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
+Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
+dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
+CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
+5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
+Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
+vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
+oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 1
+==============================================
+-----BEGIN CERTIFICATE-----
+MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
+MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
+acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
+MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
+U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
+TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
+aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
+yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
+Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
+8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
+W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
+BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
+sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
+q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
+B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
+nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 2
+==============================================
+-----BEGIN CERTIFICATE-----
+MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
+MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
+dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
+A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
+acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
+LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
+x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
+QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
+5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
+AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
+Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
+Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
+9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
+UrbnBEI=
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
+EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
+MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
+c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
+t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
+jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
+vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
+ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
+AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
+jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
+peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
+7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
+GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
+OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
+5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
+44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
+Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
+Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
+mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
+vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
+KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
+NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
+viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+SwissSign Silver CA - G2
+========================
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
+BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
+DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
+aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
+N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
+6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
+MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
+qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
+FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
+ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
+celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
+CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
+tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
+4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
+kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
+3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
+/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
+DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
+e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
+WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
+DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
+DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
+CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
+cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
+b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
+nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
+RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
+tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
+hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
+Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
+NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
+Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
+1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+thawte Primary Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
+MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
+SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
+KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
+FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
+oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
+1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
+q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
+aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
+afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
+AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
+uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
+jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
+z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G5
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
+biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
+dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
+j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
+Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
+Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
+fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
+Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
+SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
+KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
+Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
+ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+SecureTrust CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+Secure Global CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+COMODO Certification Authority
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
+-----END CERTIFICATE-----
+
+Network Solutions Certificate Authority
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
+EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
+IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
+MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
+jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
+aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
+crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
+/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
+AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
+bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
+A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
+4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
+GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
+ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+WellsSecure Public Root Certificate Authority
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
+F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
+NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
+bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
+VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
+iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
+i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
+bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
+K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
+AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
+cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
+lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
+i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
+GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
+K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
+bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
+qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
+E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
+tylv2G0xffX8oRAHh84vWdw+WNs=
+-----END CERTIFICATE-----
+
+COMODO ECC Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
+GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
+4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
+wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
+FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
+U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+IGC/A
+=====
+-----BEGIN CERTIFICATE-----
+MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
+VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
+Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
+MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
+EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
+STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
+TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
+So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
+HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
+frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
+tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
+egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
+iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
+q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
+MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
+Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
+lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
+0mBWWg==
+-----END CERTIFICATE-----
+
+Security Communication EV RootCA1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
+BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
+Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
+/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
+WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
+ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
+bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
+9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
+SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
+iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
+Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
+mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
+T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GA CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
+BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
+A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
+bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
+VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
+IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
+IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
+Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
+Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
+d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
+/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
+LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
+MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
+okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
+BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
+EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
+MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
+dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
+GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
+d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
+oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
+QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
+PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
+MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
+IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
+VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
+LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
+dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
+4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
+AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
+egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
+Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
+PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
+c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
+cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
+IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
+WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
+MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
+MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
+Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
+HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
+nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
+aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
+yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
+S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
+-----END CERTIFICATE-----
+
+Certigna
+========
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
+======================================
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
+AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
+LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
+HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
+U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
+IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
+yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
+2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
+4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
+2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
+8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
+HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
+Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
+5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
+czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
+ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
+BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
+cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
+AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
+EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
+/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
+MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
+3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
+eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
+/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
+RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
+Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
+-----END CERTIFICATE-----
+
+TC TrustCenter Class 2 CA II
+============================
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
+IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
+MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
+c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
+AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
+IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
+xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
+Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
+SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
+7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
+Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
+cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
+SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
+dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
+KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
+TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
+JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
+vQ==
+-----END CERTIFICATE-----
+
+TC TrustCenter Class 3 CA II
+============================
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
+IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
+MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
+c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
+AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
+yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
+6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
+uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
+2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
+7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
+Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
+cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
+SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
+O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
+yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
+IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
+092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
+5A==
+-----END CERTIFICATE-----
+
+TC TrustCenter Universal CA I
+=============================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
+IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
+MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
+VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
+JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
+qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
+xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
+ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
+gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
+BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
+1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
+vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
+ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
+ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
+7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
+-----END CERTIFICATE-----
+
+Deutsche Telekom Root CA 2
+==========================
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
+RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
+A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
+MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
+A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
+b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
+bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
+KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
+AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
+Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
+jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
+HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
+E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
+zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
+rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
+dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+ComSign Secured CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
+AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
+NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
+QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
+49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
+7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
+kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
+9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
+AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
+U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
+j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
+AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
+BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
+FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
+51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
+OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
+-----END CERTIFICATE-----
+
+Cybertrust Global Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
+ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
+MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
+ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
+0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
+AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
+89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
+8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
+MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
+A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
+lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
+5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
+hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
+X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+ePKI Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
+Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
+MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
+MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
+IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
+lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
+qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
+12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
+WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
+lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
+vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
+Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
+MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
+1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
+KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
+xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
+NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
+GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
+xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
+gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
+sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
+BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
+=============================================================================================================================
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
+DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
+aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
+b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
+BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
+S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
+MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
+IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
+n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
+IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
+dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
+cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
+Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
+xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
+6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
+BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
+N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
+y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
+LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
+dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
+-----END CERTIFICATE-----
+
+Buypass Class 2 CA 1
+====================
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
+MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
+cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
+0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
+0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
+uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
+1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
+7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
+fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
+wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
+-----END CERTIFICATE-----
+
+Buypass Class 3 CA 1
+====================
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
+MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
+ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
+n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
+AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
+1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
+pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
+EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
+htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
+el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
+-----END CERTIFICATE-----
+
+EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
+==========================================================================
+-----BEGIN CERTIFICATE-----
+MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
+QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
+Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
+ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
+IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
+X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
+gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
+eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
+TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
+Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
+uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
+qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
+ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
+Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
+Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
+FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
+zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
+XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
+bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
+RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
+1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
+2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
+Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
+AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
+-----END CERTIFICATE-----
+
+certSIGN ROOT CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+CNNIC ROOT
+==========
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
+ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
+OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
+o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
+VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
+VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
+czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
+y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
+wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
+lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
+Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
+O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
+BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
+G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
+mxE=
+-----END CERTIFICATE-----
+
+ApplicationCA - Japanese Government
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
+SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
+MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
+cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
+fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
+wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
+jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
+nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
+WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
+BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
+vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
+o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
+/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
+io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
+dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G3
+=============================================
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
+NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
+YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
+LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
+K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
+c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
+IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
+dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
+2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
+cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
+Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
+t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
+VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
+IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
+Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
+MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
+b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
+IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
+LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
+8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
+mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
+G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
+rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
+ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
+VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
+A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
+P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
+7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
+vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
+KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
+A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
+8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
+er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
+OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
+b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
+BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
+KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
+EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
+ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
+npaqBA+K
+-----END CERTIFICATE-----
+
+VeriSign Universal Root Certification Authority
+===============================================
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
+1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
+MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
+9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
+AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
+tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
+CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
+a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
+Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
+Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
+P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
+wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
+mJO37M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G4
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
+VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
+b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
+ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
+cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
+b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
+Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
+rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
+HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
+Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
+A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
+AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+NetLock Arany (Class Gold) Főtanúsítvány
+============================================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
+A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
+dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
+cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
+MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
+ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
+c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
+0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
+/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
+H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
+fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
+neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
+qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
+YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
+NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
+dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G2
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
+5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
+vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
+CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
+e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
+OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
+CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
+48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
+trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
+qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
+AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
+ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
+A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
+f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
+kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
+CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
+URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
+CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
+oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
+IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
+66+KAQ==
+-----END CERTIFICATE-----
+
+CA Disig
+========
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
+QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
+MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
+bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
+GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
+Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
+hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
+ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
+gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
+AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
+aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
+ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
+BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
+WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
+mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
+CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
+ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
+4Z7CRneC9VkGjCFMhwnN5ag=
+-----END CERTIFICATE-----
+
+Juur-SK
+=======
+-----BEGIN CERTIFICATE-----
+MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
+c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
+DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
+SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
+aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
+TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
+UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
+Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
+MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
+HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
+AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
+cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
+AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
+cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
+FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
+A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
+ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
+abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
+IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
+Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
+yyqcjg==
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 1
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
+DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
+NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
+IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
+ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
+auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
+qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
+V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
+HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
+h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
+l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
+IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
+T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
+c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
+-----END CERTIFICATE-----
+
+SecureSign RootCA11
+===================
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
+SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
+b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
+KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
+cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
+TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
+wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
+g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
+O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
+bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
+t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
+OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
+bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
+Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
+y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
+lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+ACEDICOM Root
+=============
+-----BEGIN CERTIFICATE-----
+MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
+T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
+MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
+A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
+WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
+YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
+MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
+m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
+HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
+xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
+3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
+2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
+TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
+4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
+9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
+bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
+aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
+eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
+zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
+ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
+KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
+nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
+I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
+MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
+tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
+f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
+hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
+CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
+bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
+D/xwzoiQ
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
+MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
+c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
+BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
+U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
+fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
+0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
+pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
+1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
+AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
+QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
+FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
+lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
+I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
+yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
+LXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
+===================================================
+-----BEGIN CERTIFICATE-----
+MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
+EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
+ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
+MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
+cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
+aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
+8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
+jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
+JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
+9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
+AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
+SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
+F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
+D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
+Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
+fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
+iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
+0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
+rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
+OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
+xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
+lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
+EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
+bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
+YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
+kpeDMdmztcpHWD9f
+-----END CERTIFICATE-----
+
+TC TrustCenter Universal CA III
+===============================
+-----BEGIN CERTIFICATE-----
+MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
+IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
+Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
+QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
+KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
+QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
+juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
+CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
+M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
+A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
+g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
+KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
+BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
+CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
+woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
+-----END CERTIFICATE-----
+
+Autoridad de Certificacion Firmaprofesional CIF A62634068
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
+DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
+bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
+ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
+51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
+R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
+T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
+Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
+osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
+crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
+saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
+KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
+6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+Izenpe.com
+==========
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
+EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
+MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
+QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
+03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
+ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
+PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
+OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
+F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
+0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
+leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
+AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
+SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
+NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
+Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
+kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
+hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
+g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
+aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
+nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
+ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
+Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
+WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+Chambers of Commerce Root - 2008
+================================
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
+Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
+ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
+EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
+cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
+XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
+h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
+ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
+NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
+D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
+lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
+0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
+EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
+G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
+BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
+bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
+bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
+CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
+AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
+wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
+3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
+RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
+M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
+YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
+9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
+zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
+nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
+-----END CERTIFICATE-----
+
+Global Chambersign Root - 2008
+==============================
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
+NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
+Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
+QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
+VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
+XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
+ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
+/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
+TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
+H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
+Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
+HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
+AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
+BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
+BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
+aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
+aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
+1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
+dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
+/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
+ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
+dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
+9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
+foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
+qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
+P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
+c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+Go Daddy Root Certificate Authority - G2
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
+MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
+A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
+9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
+fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
+NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
+BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
+vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
+5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
+N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+Starfield Root Certificate Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
+DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
+VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
+dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
+W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
+bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
+N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
+ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
+JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
+TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
+4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
+F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
+c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+Starfield Services Root Certificate Authority - G2
+==================================================
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
+IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
+dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
+h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
+hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
+LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
+rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
+SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
+E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
+xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
+YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
+-----END CERTIFICATE-----
+
+AffirmTrust Commercial
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
+MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
+DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
+C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
+BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
+MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
+HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
+hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
+qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
+0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
+sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+AffirmTrust Networking
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
+MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
+Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
+dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
+/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
+h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
+HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
+UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
+12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
+WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
+/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+AffirmTrust Premium
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
+OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
+dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
+BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
+5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
+GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
+p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
+S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
+6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
+/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
+MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
+6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
+L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
+BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
+IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
+g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
+zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+AffirmTrust Premium ECC
+=======================
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
+BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
+MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
+cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
+N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
+BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
+BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
+57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
+eQ==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
+ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
+MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
+ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
+l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
+J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
+fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
+cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
+Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
+jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
+mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
+Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+Certinomis - Autorité Racine
+=============================
+-----BEGIN CERTIFICATE-----
+MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
+LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
+A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
+JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
+wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
+Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
+2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
+jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
+c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
+lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
+xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
+530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
+4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
+KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
+WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
+R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
+nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
+CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
+JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
+qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
+WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
+wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
+vgt2Fl43N+bYdJeimUV5
+-----END CERTIFICATE-----
+
+Root CA Generalitat Valenciana
+==============================
+-----BEGIN CERTIFICATE-----
+MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
+ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
+IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
+WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
+CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
+F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
+ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
+D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
+JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
+AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
+dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
+ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
+AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
+YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
+AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
+aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
+AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
+YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
+AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
+OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
+dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
+BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
+A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
+b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
+TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
+Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
+NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
+iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
+-----END CERTIFICATE-----
+
+A-Trust-nQual-03
+================
+-----BEGIN CERTIFICATE-----
+MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
+Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
+a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
+dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
+RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
+ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
+c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
+zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
+yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
+SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
+iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
+cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
+eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
+ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
+sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
+JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
+mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
+ahq97BvIxYSazQ==
+-----END CERTIFICATE-----
+
+TWCA Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
+VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
+EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
+IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
+QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
+oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
+4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
+y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
+9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
+mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
+QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
+T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
+Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
 
\ No newline at end of file diff --git a/library/eden/paypal/error.php b/library/eden/paypal/error.php index f49af3a..68dd1d3 100644 --- a/library/eden/paypal/error.php +++ b/library/eden/paypal/error.php @@ -1,39 +1,39 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Eventbrite Errors - * - * @package Eden - * @category Paypal - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Paypal_Error extends Eden_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Eventbrite Errors + * + * @package Eden + * @category Paypal + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Paypal_Error extends Eden_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/postgre/delete.php b/library/eden/postgre/delete.php index 88ec2b6..4208a8a 100644 --- a/library/eden/postgre/delete.php +++ b/library/eden/postgre/delete.php @@ -1,57 +1,57 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Generates delete query string syntax - * - * @package Eden - * @category sql - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Postgre_Delete extends Eden_Sql_Delete { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_table = NULL; - protected $_where = array(); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($table = NULL) { - if(is_string($table)) { - $this->setTable($table); - } - } - - /* Public Methods - -------------------------------*/ - /** - * Returns the string version of the query - * - * @return string - * @notes returns the query based on the registry - */ - public function getQuery() { - return 'DELETE FROM "'. $this->_table . '" WHERE '. implode(' AND ', $this->_where).';'; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Generates delete query string syntax + * + * @package Eden + * @category sql + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Postgre_Delete extends Eden_Sql_Delete { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_table = NULL; + protected $_where = array(); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($table = NULL) { + if(is_string($table)) { + $this->setTable($table); + } + } + + /* Public Methods + -------------------------------*/ + /** + * Returns the string version of the query + * + * @return string + * @notes returns the query based on the registry + */ + public function getQuery() { + return 'DELETE FROM "'. $this->_table . '" WHERE '. implode(' AND ', $this->_where).';'; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/postgre/error.php b/library/eden/postgre/error.php index 3d9f016..0646c5a 100644 --- a/library/eden/postgre/error.php +++ b/library/eden/postgre/error.php @@ -1,39 +1,39 @@ - -/* - * This file is part of the Eden package. - * (c) 2010-2012 Christian Blanquera - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Postgre Errors - * - * @package Eden - * @category sql - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Postgre_Error extends Eden_Sql_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2010-2012 Christian Blanquera + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Postgre Errors + * + * @package Eden + * @category sql + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Postgre_Error extends Eden_Sql_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/postgre/select.php b/library/eden/postgre/select.php index cc9409f..09b0c2e 100644 --- a/library/eden/postgre/select.php +++ b/library/eden/postgre/select.php @@ -1,60 +1,60 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Generates select query string syntax - * - * @package Eden - * @category sql - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Postgre_Select extends Eden_Sql_Select { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns the string version of the query - * - * @param bool - * @return string - * @notes returns the query based on the registry - */ - public function getQuery() { - $joins = empty($this->_joins) ? '' : implode(' ', $this->_joins); - $where = empty($this->_where) ? '' : 'WHERE '.implode(' AND ', $this->_where); - $sort = empty($this->_sortBy) ? '' : 'ORDER BY '.implode(', ', $this->_sortBy); - $limit = is_null($this->_page) ? '' : 'LIMIT ' . $this->_page .' OFFSET ' .$this->_length; - $group = empty($this->_group) ? '' : 'GROUP BY ' . implode(', ', $this->_group); - - $query = sprintf( - 'SELECT %s FROM %s %s %s %s %s %s;', - $this->_select, $this->_from, $joins, - $where, $group, $sort, $limit); - - return str_replace(' ', ' ', $query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Generates select query string syntax + * + * @package Eden + * @category sql + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Postgre_Select extends Eden_Sql_Select { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns the string version of the query + * + * @param bool + * @return string + * @notes returns the query based on the registry + */ + public function getQuery() { + $joins = empty($this->_joins) ? '' : implode(' ', $this->_joins); + $where = empty($this->_where) ? '' : 'WHERE '.implode(' AND ', $this->_where); + $sort = empty($this->_sortBy) ? '' : 'ORDER BY '.implode(', ', $this->_sortBy); + $limit = is_null($this->_page) ? '' : 'LIMIT ' . $this->_page .' OFFSET ' .$this->_length; + $group = empty($this->_group) ? '' : 'GROUP BY ' . implode(', ', $this->_group); + + $query = sprintf( + 'SELECT %s FROM %s %s %s %s %s %s;', + $this->_select, $this->_from, $joins, + $where, $group, $sort, $limit); + + return str_replace(' ', ' ', $query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/route/error.php b/library/eden/route/error.php index 33341c2..27c7d96 100644 --- a/library/eden/route/error.php +++ b/library/eden/route/error.php @@ -1,32 +1,32 @@ - -/** - * Route Errors - */ -class Eden_Route_Error extends Eden_Error { - /* Constants - -------------------------------*/ - const CLASS_NOT_EXISTS = 'Invalid class call: %s->%s(). Class does not exist.'; - const METHOD_NOT_EXISTS = 'Invalid class call: %s->%s(). Method does not exist.'; - const STATIC_ERROR = 'Invalid class call: %s::%s().'; - const FUNCTION_ERROR = 'Invalid function run: %s().'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/** + * Route Errors + */ +class Eden_Route_Error extends Eden_Error { + /* Constants + -------------------------------*/ + const CLASS_NOT_EXISTS = 'Invalid class call: %s->%s(). Class does not exist.'; + const METHOD_NOT_EXISTS = 'Invalid class call: %s->%s(). Method does not exist.'; + const STATIC_ERROR = 'Invalid class call: %s::%s().'; + const FUNCTION_ERROR = 'Invalid function run: %s().'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/route/method.php b/library/eden/route/method.php index f3004d7..afc5036 100644 --- a/library/eden/route/method.php +++ b/library/eden/route/method.php @@ -1,266 +1,266 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Definition for overloading methods. - * This class also provides methods to list out various routes - * and has the ability to call methods, static methods and - * functions passing arguments as an array. - * - * @package Eden - * @category core - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Route_Method extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected static $_instance = NULL; - protected $_route = array(); //method registry - - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - public static function i() { - $class = __CLASS__; - if(is_null(self::$_instance)) { - self::$_instance = new $class(); - } - - return self::$_instance; - } - - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /** - * Calls a method considering all routes - * - * @param *string|object the class name - * @param *string the method name - * @param array the arguments you want to pass into the method - * @return mixed - */ - public function call($class, $method, array $args = array()) { - //argument test - Eden_Route_Error::i() - ->argument(1, 'string', 'object') //argument 1 must be string or object - ->argument(2, 'string'); //argument 2 must be string - - $instance = NULL; - if(is_object($class)) { - $instance = $class; - $class = get_class($class); - } - - $classRoute = Eden_Route_Class::i(); - $isClassRoute = $classRoute->isRoute($class); - $isMethodRoute = $this->isRoute($class, $method); - - //method might be a route - //lets make sure we are dealing with the right method - //this also checks class as well - list($class, $method) = $this->getRoute($class, $method); - - //class does not exist - if(!is_object($class) && !class_exists($class)) { - //throw exception - Eden_Route_Error::i() - ->setMessage(Eden_Route_Error::CLASS_NOT_EXISTS) - ->addVariable($class) - ->addVariable($method) - ->trigger(); - } - - //method does not exist - if(!$isClassRoute && !$isMethodRoute && !method_exists($class, $method)) { - //throw exception - Eden_Route_Error::i() - ->setMessage(Eden_Route_Error::METHOD_NOT_EXISTS) - ->addVariable($class) - ->addVariable($method) - ->trigger(); - } - - //if there is a route or no instance - if($isClassRoute || !$instance) { - $instance = $classRoute->call($class); - } - - return call_user_func_array(array(&$instance, $method), $args); - } - - /** - * Calls a static method considering all routes - * - * @param *string|object the class name - * @param *string the method name - * @param array the arguments you want to pass into the method - * @return mixed - */ - public function callStatic($class, $method, array $args = array()) { - //argument test - Eden_Route_Error::i() - ->argument(1, 'string', 'object') //argument 1 must be string or object - ->argument(2, 'string'); //argument 2 must be string - - if(is_object($class)) { - $class = get_class($class); - } - - $isClassRoute = Eden_Route_Class::i()->isRoute($class); - $isMethodRoute = $this->isRoute($class, $method); - - //method might be a route - //lets make sure we are dealing with the right method - //this also checks class as well - list($class, $method) = $this->getRoute($class, $method); - - //class does not exist - if(!is_object($class) && !class_exists($class)) { - //throw exception - Eden_Route_Error::i() - ->setMessage(Eden_Route_Error::CLASS_NOT_EXISTS) - ->addVariable($class) - ->addVariable($method) - ->trigger(); - } - - //method does not exist - if(!$isClassRoute && !$isMethodRoute && !method_exists($class, $method)) { - //throw exception - Eden_Route_Error::i() - ->setMessage(Eden_Route_Error::METHOD_NOT_EXISTS) - ->addVariable($class) - ->addVariable($method) - ->trigger(); - } - - if(is_object($class)) { - $class = get_class($class); - } - - return call_user_func_array($class.'::'.$method, $args); // As of 5.2.3 - } - - /** - * Returns the class and method that will be routed to given the route. - * - * @param *string the class route name - * @param *string the class route method - * @param string|null returns this variable if no route is found - * @return array|variable - */ - public function getRoute($class, $method) { - Eden_Route_Error::i() - ->argument(1, 'string') //argument 1 must be a string - ->argument(2, 'string'); //argument 2 must be a string - - if($this->isRoute(NULL, $method)) { - return $this->_route[NULL][strtolower($method)]; - } - - $class = Eden_Route_Class::i()->getRoute($class); - - if($this->isRoute($class, $method)) { - return $this->_route[strtolower($class)][strtolower($method)]; - } - - return array($class, $method); - } - - /** - * Returns all method routes - * - * @return array - */ - public function getRoutes() { - return $this->_route; - } - - /** - * Checks to see if a name is a route - * - * @param string - * @param string - * @return bool - */ - public function isRoute($class, $method) { - if(is_string($class)) { - $class = strtolower($class); - } - - return isset($this->_route[$class][strtolower($method)]); - } - - /** - * Unsets the route - * - * @param *string the class route name - * @return string|variable - */ - public function release($class, $method) { - if($this->isRoute($class, $method)) { - unset($this->_route[strtolower($class)][strtolower($method)]); - } - - return $this; - } - - /** - * Routes a method. - * - * @param *string the class route name - * @param *string the method route name - * @param *string the name of the class to route to - * @param *string the name of the method to route to - * @return Eden_Route - */ - public function route($source, $alias, $class, $method = NULL) { - //argument test - Eden_Route_Error::i() - ->argument(1, 'string', 'object', 'null') //argument 1 must be a string, object or null - ->argument(2, 'string') //argument 2 must be a string - ->argument(3, 'string', 'object') //argument 3 must be a string or object - ->argument(4, 'string'); //argument 4 must be a string - - if(is_object($source)) { - $source = get_class($source); - } - - //if the method is not a string - if(!is_string($method)) { - $method = $alias; - } - - $route = Eden_Route_Class::i(); - if(!is_null($source)) { - $source = $route->getRoute($source); - $source = strtolower($source); - } - - if(is_string($class)) { - $class = $route->getRoute($class); - } - - $this->_route[$source][strtolower($alias)] = array($class, $method); - - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Definition for overloading methods. + * This class also provides methods to list out various routes + * and has the ability to call methods, static methods and + * functions passing arguments as an array. + * + * @package Eden + * @category core + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Route_Method extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected static $_instance = NULL; + protected $_route = array(); //method registry + + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + public static function i() { + $class = __CLASS__; + if(is_null(self::$_instance)) { + self::$_instance = new $class(); + } + + return self::$_instance; + } + + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /** + * Calls a method considering all routes + * + * @param *string|object the class name + * @param *string the method name + * @param array the arguments you want to pass into the method + * @return mixed + */ + public function call($class, $method, array $args = array()) { + //argument test + Eden_Route_Error::i() + ->argument(1, 'string', 'object') //argument 1 must be string or object + ->argument(2, 'string'); //argument 2 must be string + + $instance = NULL; + if(is_object($class)) { + $instance = $class; + $class = get_class($class); + } + + $classRoute = Eden_Route_Class::i(); + $isClassRoute = $classRoute->isRoute($class); + $isMethodRoute = $this->isRoute($class, $method); + + //method might be a route + //lets make sure we are dealing with the right method + //this also checks class as well + list($class, $method) = $this->getRoute($class, $method); + + //class does not exist + if(!is_object($class) && !class_exists($class)) { + //throw exception + Eden_Route_Error::i() + ->setMessage(Eden_Route_Error::CLASS_NOT_EXISTS) + ->addVariable($class) + ->addVariable($method) + ->trigger(); + } + + //method does not exist + if(!$isClassRoute && !$isMethodRoute && !method_exists($class, $method)) { + //throw exception + Eden_Route_Error::i() + ->setMessage(Eden_Route_Error::METHOD_NOT_EXISTS) + ->addVariable($class) + ->addVariable($method) + ->trigger(); + } + + //if there is a route or no instance + if($isClassRoute || !$instance) { + $instance = $classRoute->call($class); + } + + return call_user_func_array(array(&$instance, $method), $args); + } + + /** + * Calls a static method considering all routes + * + * @param *string|object the class name + * @param *string the method name + * @param array the arguments you want to pass into the method + * @return mixed + */ + public function callStatic($class, $method, array $args = array()) { + //argument test + Eden_Route_Error::i() + ->argument(1, 'string', 'object') //argument 1 must be string or object + ->argument(2, 'string'); //argument 2 must be string + + if(is_object($class)) { + $class = get_class($class); + } + + $isClassRoute = Eden_Route_Class::i()->isRoute($class); + $isMethodRoute = $this->isRoute($class, $method); + + //method might be a route + //lets make sure we are dealing with the right method + //this also checks class as well + list($class, $method) = $this->getRoute($class, $method); + + //class does not exist + if(!is_object($class) && !class_exists($class)) { + //throw exception + Eden_Route_Error::i() + ->setMessage(Eden_Route_Error::CLASS_NOT_EXISTS) + ->addVariable($class) + ->addVariable($method) + ->trigger(); + } + + //method does not exist + if(!$isClassRoute && !$isMethodRoute && !method_exists($class, $method)) { + //throw exception + Eden_Route_Error::i() + ->setMessage(Eden_Route_Error::METHOD_NOT_EXISTS) + ->addVariable($class) + ->addVariable($method) + ->trigger(); + } + + if(is_object($class)) { + $class = get_class($class); + } + + return call_user_func_array($class.'::'.$method, $args); // As of 5.2.3 + } + + /** + * Returns the class and method that will be routed to given the route. + * + * @param *string the class route name + * @param *string the class route method + * @param string|null returns this variable if no route is found + * @return array|variable + */ + public function getRoute($class, $method) { + Eden_Route_Error::i() + ->argument(1, 'string') //argument 1 must be a string + ->argument(2, 'string'); //argument 2 must be a string + + if($this->isRoute(NULL, $method)) { + return $this->_route[NULL][strtolower($method)]; + } + + $class = Eden_Route_Class::i()->getRoute($class); + + if($this->isRoute($class, $method)) { + return $this->_route[strtolower($class)][strtolower($method)]; + } + + return array($class, $method); + } + + /** + * Returns all method routes + * + * @return array + */ + public function getRoutes() { + return $this->_route; + } + + /** + * Checks to see if a name is a route + * + * @param string + * @param string + * @return bool + */ + public function isRoute($class, $method) { + if(is_string($class)) { + $class = strtolower($class); + } + + return isset($this->_route[$class][strtolower($method)]); + } + + /** + * Unsets the route + * + * @param *string the class route name + * @return string|variable + */ + public function release($class, $method) { + if($this->isRoute($class, $method)) { + unset($this->_route[strtolower($class)][strtolower($method)]); + } + + return $this; + } + + /** + * Routes a method. + * + * @param *string the class route name + * @param *string the method route name + * @param *string the name of the class to route to + * @param *string the name of the method to route to + * @return Eden_Route + */ + public function route($source, $alias, $class, $method = NULL) { + //argument test + Eden_Route_Error::i() + ->argument(1, 'string', 'object', 'null') //argument 1 must be a string, object or null + ->argument(2, 'string') //argument 2 must be a string + ->argument(3, 'string', 'object') //argument 3 must be a string or object + ->argument(4, 'string'); //argument 4 must be a string + + if(is_object($source)) { + $source = get_class($source); + } + + //if the method is not a string + if(!is_string($method)) { + $method = $alias; + } + + $route = Eden_Route_Class::i(); + if(!is_null($source)) { + $source = $route->getRoute($source); + $source = strtolower($source); + } + + if(is_string($class)) { + $class = $route->getRoute($class); + } + + $this->_route[$source][strtolower($alias)] = array($class, $method); + + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/sql/collection.php b/library/eden/sql/collection.php index e905810..7195326 100644 --- a/library/eden/sql/collection.php +++ b/library/eden/sql/collection.php @@ -1,137 +1,137 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Sql Collection handler - * - * @package Eden - * @category sql - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Sql_Collection extends Eden_Collection { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_model = Eden_Sql_Database::MODEL; - protected $_database = NULL; - protected $_table = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Adds a row to the collection - * - * @param array|Eden_Model - * @return this - */ - public function add($row = array()) { - //Argument 1 must be an array or Eden_Model - Eden_Sql_Error::i()->argument(1, 'array', $this->_model); - - //if it's an array - if(is_array($row)) { - //make it a model - $model = $this->_model; - $row = $this->$model($row); - } - - if(!is_null($this->_database)) { - $row->setDatabase($this->_database); - } - - if(!is_null($this->_table)) { - $row->setTable($this->_table); - } - - //add it now - $this->_list[] = $row; - - return $this; - } - - /** - * Sets the default database - * - * @param Eden_Sql - */ - public function setDatabase(Eden_Sql_Database $database) { - $this->_database = $database; - - //for each row - foreach($this->_list as $row) { - if(!is_object($row) || !method_exists($row, __FUNCTION__)) { - continue; - } - - //let the row handle this - $row->setDatabase($database); - } - - return $this; - } - - /** - * Sets default model - * - * @param string - * @return this - */ - public function setModel($model) { - $error = Eden_Sql_Error::i()->argument(1, 'string'); - - if(!is_subclass_of($model, 'Eden_Model')) { - $error->setMessage(Eden_Sql_Error::NOT_SUB_MODEL) - ->addVariable($model) - ->trigger(); - } - - $this->_model = $model; - return $this; - } - - /** - * Sets the default database - * - * @param string - */ - public function setTable($table) { - //Argument 1 must be a string - Eden_Sql_Error::i()->argument(1, 'string'); - - $this->_table = $table; - - //for each row - foreach($this->_list as $row) { - if(!is_object($row) || !method_exists($row, __FUNCTION__)) { - continue; - } - - //let the row handle this - $row->setTable($table); - } - - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Sql Collection handler + * + * @package Eden + * @category sql + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Sql_Collection extends Eden_Collection { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_model = Eden_Sql_Database::MODEL; + protected $_database = NULL; + protected $_table = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Adds a row to the collection + * + * @param array|Eden_Model + * @return this + */ + public function add($row = array()) { + //Argument 1 must be an array or Eden_Model + Eden_Sql_Error::i()->argument(1, 'array', $this->_model); + + //if it's an array + if(is_array($row)) { + //make it a model + $model = $this->_model; + $row = $this->$model($row); + } + + if(!is_null($this->_database)) { + $row->setDatabase($this->_database); + } + + if(!is_null($this->_table)) { + $row->setTable($this->_table); + } + + //add it now + $this->_list[] = $row; + + return $this; + } + + /** + * Sets the default database + * + * @param Eden_Sql + */ + public function setDatabase(Eden_Sql_Database $database) { + $this->_database = $database; + + //for each row + foreach($this->_list as $row) { + if(!is_object($row) || !method_exists($row, __FUNCTION__)) { + continue; + } + + //let the row handle this + $row->setDatabase($database); + } + + return $this; + } + + /** + * Sets default model + * + * @param string + * @return this + */ + public function setModel($model) { + $error = Eden_Sql_Error::i()->argument(1, 'string'); + + if(!is_subclass_of($model, 'Eden_Model')) { + $error->setMessage(Eden_Sql_Error::NOT_SUB_MODEL) + ->addVariable($model) + ->trigger(); + } + + $this->_model = $model; + return $this; + } + + /** + * Sets the default database + * + * @param string + */ + public function setTable($table) { + //Argument 1 must be a string + Eden_Sql_Error::i()->argument(1, 'string'); + + $this->_table = $table; + + //for each row + foreach($this->_list as $row) { + if(!is_object($row) || !method_exists($row, __FUNCTION__)) { + continue; + } + + //let the row handle this + $row->setTable($table); + } + + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/sql/database.php b/library/eden/sql/database.php index 08cc7af..914ea49 100755 --- a/library/eden/sql/database.php +++ b/library/eden/sql/database.php @@ -1,766 +1,766 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/../event.php'; -require_once dirname(__FILE__).'/../collection.php'; -require_once dirname(__FILE__).'/../model.php'; -require_once dirname(__FILE__).'/error.php'; -require_once dirname(__FILE__).'/query.php'; -require_once dirname(__FILE__).'/delete.php'; -require_once dirname(__FILE__).'/select.php'; -require_once dirname(__FILE__).'/update.php'; -require_once dirname(__FILE__).'/insert.php'; -require_once dirname(__FILE__).'/collection.php'; -require_once dirname(__FILE__).'/model.php'; -require_once dirname(__FILE__).'/search.php'; - -/** - * Abstractly defines a layout of available methods to - * connect to and query a database. This class also lays out - * query building methods that auto renders a valid query - * the specific database will understand without actually - * needing to know the query language. - * - * @package Eden - * @category sql - * @author Christian Blanquera cblanquera@openovate.com - */ -abstract class Eden_Sql_Database extends Eden_Event { - /* Constants - -------------------------------*/ - const QUERY = 'Eden_Sql_Query'; - - const FIRST = 'first'; - const LAST = 'last'; - - const MODEL = 'Eden_Sql_Model'; - const COLLECTION = 'Eden_Sql_Collection'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_queries = array(); - - protected $_connection = NULL; - protected $_binds = array(); - - protected $_model = self::MODEL; - protected $_collection = self::COLLECTION; - - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /** - * Connects to the database - * - * @param array the connection options - * @return this - */ - abstract public function connect(array $options = array()); - - /** - * Binds a value and returns the bound key - * - * @param string - * @return string - */ - public function bind($value) { - //Argument 1 must be an array, string or number - Eden_Sql_Error::i()->argument(1, 'array', 'string', 'numeric', 'null'); - - if(is_array($value)) { - foreach($value as $i => $item) { - $value[$i] = $this->bind($item); - } - - return '('.implode(",",$value).')'; - } else if(is_numeric($value)) { - return $value; - } - - $name = ':bind'.count($this->_binds).'bind'; - $this->_binds[$name] = $value; - return $name; - } - - /** - * Returns collection - * - * @return Eden_Sql_Collection - */ - public function collection(array $data = array()) { - $collection = $this->_collection; - return $this->$collection() - ->setDatabase($this) - ->setModel($this->_model) - ->set($data); - } - - /** - * Returns the delete query builder - * - * @return Eden_Sql_Delete - */ - public function delete($table = NULL) { - //Argument 1 must be a string or null - Eden_Sql_Error::i()->argument(1, 'string', 'null'); - - return Eden_Sql_Delete::i($table); - } - - /** - * Removes rows that match a filter - * - * @param string table - * @param array filter - * @return var - */ - public function deleteRows($table, $filters = NULL) { - //Argument 1 must be a string - Eden_Sql_Error::i()->argument(1, 'string'); - - $query = $this->delete($table); - - if(is_array($filters)) { - foreach($filters as $i => $filter) { - //array('post_id=%s AND post_title IN %s', 123, array('asd')); - $format = array_shift($filter); - - foreach($filter as $j => $value) { - $filter[$j] = $this->bind($value); - } - - $filters[$i] = vsprintf($format, $filter); - } - } - - $query->where($filters); - - //run the query - $this->query($query, $this->getBinds()); - - $this->trigger($table, $filters); - - return $this; - } - - /** - * Returns all the bound values of this query - * - * @param void - * @return array - */ - public function getBinds() { - return $this->_binds; - } - - /** - * Returns a collection given the query parameters - * - * @param string table - * @param array joins - * @param array filter - * @param array sort - * @param int start - * @param int range - * @return array - */ - public function getCollection($table, array $joins = array(), $filters = NULL, - array $sort = array(), $start = 0, $range = 0, $index = NULL) { - //argument test - Eden_Sql_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(3, 'string', 'array', 'null') //Argument 3 must be a string number or null - ->argument(5, 'numeric') //Argument 5 must be a number - ->argument(6, 'numeric') //Argument 6 must be a number - ->argument(7, 'numeric', 'null'); //Argument 7 must be a number or null - - $results = $this->getRows($table, $joins, $filters, $sort, $start, $range, $index); - - $collection = $this->collection() - ->setTable($table) - ->setModel($this->_model); - - if(is_null($results)) { - return $collection; - } - - if(!is_null($index)) { - return $this->model($results)->setTable($table); - } - - return $collection->set($results); - } - - /** - * Returns the connection object - * if no connection has been made - * it will attempt to make it - * - * @param array connection options - * @return PDO connection resource - */ - public function getConnection() { - if(!$this->_connection) { - $this->connect(); - } - - return $this->_connection; - } - - /** - * Returns the last inserted id - * - * @return int the id - */ - public function getLastInsertedId() { - return $this->getConnection()->lastInsertId(); - } - - /** - * Returns a model given the column name and the value - * - * @param string table - * @param string name - * @param string value - * @return array|NULL - */ - public function getModel($table, $name, $value) { - //argument test - Eden_Sql_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string', 'numeric'); //Argument 3 must be a string or number - - $result = $this->getRow($table, $name, $value); - - $model = $this->model()->setTable($table); - - if(is_null($result)) { - return $model; - } - - return $model->set($result); - } - - /** - * Returns the history of queries made still in memory - * - * @return array the queries - */ - public function getQueries($index = NULL) { - if(is_null($index)) { - return $this->_queries; - } - - if($index == self::FIRST) { - $index = 0; - } - - if($index == self::LAST) { - $index = count($this->_queries) - 1; - } - - if(isset($this->_queries[$index])) { - return $this->_queries[$index]; - } - - return NULL; - } - - /** - * Returns a 1 row result given the column name and the value - * - * @param string table - * @param string name - * @param string value - * @return array - */ - public function getRow($table, $name, $value) { - //argument test - Eden_Sql_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string', 'numeric'); //Argument 3 must be a string or number - - $query = $this->select() - ->from($table) - ->where($name.' = '.$this->bind($value)) - ->limit(0, 1); - - $results = $this->query($query, $this->getBinds()); - - $this->trigger($table, $name, $value, $results); - - return isset($results[0]) ? $results[0] : NULL; - } - - /** - * Returns a list of results given the query parameters - * - * @param string table - * @param array joins - * @param array filter - * @param array sort - * @param int start - * @param int range - * @return array - */ - public function getRows($table, array $joins = array(), $filters = NULL, - array $sort = array(), $start = 0, $range = 0, $index = NULL) { - //argument test - Eden_Sql_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(3, 'string', 'array', 'null') //Argument 3 must be a string number or null - ->argument(5, 'numeric') //Argument 5 must be a number - ->argument(6, 'numeric') //Argument 6 must be a number - ->argument(7, 'numeric', 'null'); //Argument 7 must be a number or null - - $query = $this->select()->from($table); - - foreach($joins as $join) { - if(!is_array($join) || count($join) < 3) { - continue; - } - - if(count($join) == 3) { - $join[] = true; - } - - $query->join($join[0], $join[1], $join[2], $join[3]); - } - - if(is_array($filters)) { - foreach($filters as $i => $filter) { - //array('post_id=%s AND post_title IN %s', 123, array('asd')); - $format = array_shift($filter); - - foreach($filter as $j => $value) { - $filter[$j] = $this->bind($value); - } - - $filters[$i] = vsprintf($format, $filter); - } - } - - if(!is_null($filters)) { - $query->where($filters); - } - - if(!empty($sort)) { - foreach($sort as $key => $value) { - if(is_string($key) && trim($key)) { - $query->sortBy($key, $value); - } - } - } - - if($range) { - $query->limit($start, $range); - } - - $results = $this->query($query, $this->getBinds()); - - if(!is_null($index)) { - if(empty($results)) { - $results = NULL; - } else { - if($index == self::FIRST) { - $index = 0; - } - - if($index == self::LAST) { - $index = count($results)-1; - } - - if(isset($results[$index])) { - $results = $results[$index]; - } else { - $results = NULL; - } - } - } - - $this->trigger($table, $joins, $filters, $sort, $start, $range, $index, $results); - - return $results; - } - - /** - * Returns the number of results given the query parameters - * - * @param string table - * @param array filter - * @return int | false - */ - public function getRowsCount($table, array $joins = array(), $filters = NULL) { - //argument test - Eden_Sql_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(3, 'string', 'array', 'null'); //Argument 3 must be a string number or null - - $query = $this->select('COUNT(*) as count')->from($table); - - foreach($joins as $join) { - if(!is_array($join) || count($join) < 3) { - continue; - } - - if(count($join) == 3) { - $join[] = true; - } - - $query->join($join[0], $join[1], $join[2], $join[3]); - } - - if(is_array($filters)) { - foreach($filters as $i => $filter) { - //array('post_id=%s AND post_title IN %s', 123, array('asd')); - $format = array_shift($filter); - $filter = $this->bind($filter); - $filters[$i] = vsprintf($format, $filter); - } - } - - $query->where($filters); - - $results = $this->query($query, $this->getBinds()); - - if(isset($results[0]['count'])) { - $this->trigger($table, $joins, $filters, $results[0]['count']); - return $results[0]['count']; - } - - $this->trigger($table, $joins, $filters, false); - - return false; - } - - /** - * Returns the insert query builder - * - * @return Eden_Sql_Insert - */ - public function insert($table = NULL) { - //Argument 1 must be a string or null - Eden_Sql_Error::i()->argument(1, 'string', 'null'); - - return Eden_Sql_Insert::i($table); - } - - /** - * Inserts data into a table and returns the ID - * - * @param string table - * @param array setting - * @return int - */ - public function insertRow($table, array $setting, $bind = true) { - //Argument 1 must be a string - Eden_Sql_Error::i()->argument(1, 'string')->argument(3, 'array', 'bool'); - - $query = $this->insert($table); - - foreach($setting as $key => $value) { - if(is_null($value) || is_bool($value)) { - $query->set($key, $value); - continue; - } - - if((is_bool($bind) && $bind) || (is_array($bind) && in_array($key, $bind))) { - $value = $this->bind($value); - } - - $query->set($key, $value); - } - - //run the query - $this->query($query, $this->getBinds()); - - $this->trigger($table, $setting); - - return $this; - } - - /** - * Inserts multiple rows into a table - * - * @param string table - * @param array settings - * @return void - */ - public function insertRows($table, array $settings, $bind = true) { - //Argument 1 must be a string - Eden_Sql_Error::i()->argument(1, 'string')->argument(3, 'array', 'bool'); - - $query = $this->insert($table); - - foreach($settings as $index => $setting) { - foreach($setting as $key => $value) { - if(is_null($value) || is_bool($value)) { - $query->set($key, $value); - continue; - } - - if((is_bool($bind) && $bind) || (is_array($bind) && in_array($key, $bind))) { - $value = $this->bind($value); - } - - $query->set($key, $value, $index); - } - } - - //run the query - $this->query($query, $this->getBinds()); - - $this->trigger($table, $settings); - - return $this; - } - - /** - * Returns model - * - * @return Eden_Sql_Model - */ - public function model(array $data = array()) { - $model = $this->_model; - return $this->$model($data)->setDatabase($this); - } - - /** - * Queries the database - * - * @param string query - * @param array binded value - * @return array|object - */ - public function query($query, array $binds = array()) { - //Argument 1 must be a string or null - Eden_Sql_Error::i()->argument(1, 'string', self::QUERY); - - $connection = $this->getConnection(); - $query = (string) $query; - $stmt = $connection->prepare($query); - - foreach($binds as $key => $value) { - $stmt->bindValue($key, $value); - } - - if(!$stmt->execute()) { - $error = $stmt->errorInfo(); - - foreach($binds as $key => $value) { - $query = str_replace($key, "'$value'", $query); - } - - Eden_Sql_Error::i() - ->setMessage(Eden_Sql_Error::QUERY_ERROR) - ->addVariable($query) - ->addVariable($error[2]) - ->trigger(); - } - - $results = $stmt->fetchAll( PDO::FETCH_ASSOC ); - - $this->_queries[] = array( - 'query' => $query, - 'binds' => $binds, - 'results' => $results); - - $this->_binds = array(); - - $this->trigger($query, $binds, $results); - - return $results; - } - - /** - * Returns search - * - * @return Eden_Sql_Search - */ - public function search($table = NULL) { - //Argument 1 must be a string or null - Eden_Sql_Error::i()->argument(1, 'string', 'null'); - - $search = Eden_Sql_Search::i($this) - ->setCollection($this->_collection) - ->setModel($this->_model); - - if($table) { - $search->setTable($table); - } - - return $search; - } - - /** - * Returns the select query builder - * - * @return Eden_Sql_Select - */ - public function select($select = '*') { - //Argument 1 must be a string or array - Eden_Sql_Error::i()->argument(1, 'string', 'array'); - - return Eden_Sql_Select::i($select); - } - - /** - * Sets all the bound values of this query - * - * @param array - * @return this - */ - public function setBinds(array $binds) { - $this->_binds = $binds; - return $this; - } - - /** - * Sets default collection - * - * @param string - * @return this - */ - public function setCollection($collection) { - $error = Eden_Sql_Error::i()->argument(1, 'string'); - - if(!is_subclass_of($collection, self::COLLECTION)) { - $error->setMessage(Eden_Sql_Error::NOT_SUB_COLLECTION) - ->addVariable($collection) - ->trigger(); - } - - $this->_collection = $collection; - return $this; - } - - /** - * Sets the default model - * - * @param string - * @return this - */ - public function setModel($model) { - $error = Eden_Sql_Error::i()->argument(1, 'string'); - - if(!is_subclass_of($model, self::MODEL)) { - $error->setMessage(Eden_Sql_Error::NOT_SUB_MODEL) - ->addVariable($model) - ->trigger(); - } - - $this->_model = $model; - return $this; - } - - /** - * Sets only 1 row given the column name and the value - * - * @param string table - * @param string name - * @param string value - * @param array setting - * @return var - */ - public function setRow($table, $name, $value, array $setting) { - //argument test - Eden_Sql_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string', 'numeric'); //Argument 3 must be a string or number - - //first check to see if the row exists - $row = $this->getRow($table, $name, $value); - - if(!$row) { - //we need to insert - $setting[$name] = $value; - return $this->insertRow($table, $setting); - } else { - //we need to update this row - return $this->updateRows($table, $setting, array(array($name.'=%s', $value))); - } - } - - /** - * Returns the update query builder - * - * @return Eden_Sql_Update - */ - public function update($table = NULL) { - //Argument 1 must be a string or null - Eden_Sql_Error::i()->argument(1, 'string', 'null'); - - return Eden_Sql_Update::i($table); - } - - /** - * Updates rows that match a filter given the update settings - * - * @param string table - * @param array setting - * @param array filter - * @return var - */ - public function updateRows($table, array $setting, $filters = NULL, $bind = true) { - //Argument 1 must be a string - Eden_Sql_Error::i()->argument(1, 'string')->argument(4, 'array', 'bool'); - - $query = $this->update($table); - - foreach($setting as $key => $value) { - if(is_null($value) || is_bool($value)) { - $query->set($key, $value); - continue; - } - - if((is_bool($bind) && $bind) || (is_array($bind) && in_array($key, $bind))) { - $value = $this->bind($value); - } - - $query->set($key, $value); - } - - if(is_array($filters)) { - foreach($filters as $i => $filter) { - //array('post_id=%s AND post_title IN %s', 123, array('asd')); - $format = array_shift($filter); - - foreach($filter as $j => $value) { - $filter[$j] = $this->bind($value); - } - - $filters[$i] = vsprintf($format, $filter); - } - } - - $query->where($filters); - - //run the query - $this->query($query, $this->getBinds()); - - $this->trigger($table, $setting, $filters); - - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/../event.php'; +require_once dirname(__FILE__).'/../collection.php'; +require_once dirname(__FILE__).'/../model.php'; +require_once dirname(__FILE__).'/error.php'; +require_once dirname(__FILE__).'/query.php'; +require_once dirname(__FILE__).'/delete.php'; +require_once dirname(__FILE__).'/select.php'; +require_once dirname(__FILE__).'/update.php'; +require_once dirname(__FILE__).'/insert.php'; +require_once dirname(__FILE__).'/collection.php'; +require_once dirname(__FILE__).'/model.php'; +require_once dirname(__FILE__).'/search.php'; + +/** + * Abstractly defines a layout of available methods to + * connect to and query a database. This class also lays out + * query building methods that auto renders a valid query + * the specific database will understand without actually + * needing to know the query language. + * + * @package Eden + * @category sql + * @author Christian Blanquera cblanquera@openovate.com + */ +abstract class Eden_Sql_Database extends Eden_Event { + /* Constants + -------------------------------*/ + const QUERY = 'Eden_Sql_Query'; + + const FIRST = 'first'; + const LAST = 'last'; + + const MODEL = 'Eden_Sql_Model'; + const COLLECTION = 'Eden_Sql_Collection'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_queries = array(); + + protected $_connection = NULL; + protected $_binds = array(); + + protected $_model = self::MODEL; + protected $_collection = self::COLLECTION; + + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /** + * Connects to the database + * + * @param array the connection options + * @return this + */ + abstract public function connect(array $options = array()); + + /** + * Binds a value and returns the bound key + * + * @param string + * @return string + */ + public function bind($value) { + //Argument 1 must be an array, string or number + Eden_Sql_Error::i()->argument(1, 'array', 'string', 'numeric', 'null'); + + if(is_array($value)) { + foreach($value as $i => $item) { + $value[$i] = $this->bind($item); + } + + return '('.implode(",",$value).')'; + } else if(is_numeric($value)) { + return $value; + } + + $name = ':bind'.count($this->_binds).'bind'; + $this->_binds[$name] = $value; + return $name; + } + + /** + * Returns collection + * + * @return Eden_Sql_Collection + */ + public function collection(array $data = array()) { + $collection = $this->_collection; + return $this->$collection() + ->setDatabase($this) + ->setModel($this->_model) + ->set($data); + } + + /** + * Returns the delete query builder + * + * @return Eden_Sql_Delete + */ + public function delete($table = NULL) { + //Argument 1 must be a string or null + Eden_Sql_Error::i()->argument(1, 'string', 'null'); + + return Eden_Sql_Delete::i($table); + } + + /** + * Removes rows that match a filter + * + * @param string table + * @param array filter + * @return var + */ + public function deleteRows($table, $filters = NULL) { + //Argument 1 must be a string + Eden_Sql_Error::i()->argument(1, 'string'); + + $query = $this->delete($table); + + if(is_array($filters)) { + foreach($filters as $i => $filter) { + //array('post_id=%s AND post_title IN %s', 123, array('asd')); + $format = array_shift($filter); + + foreach($filter as $j => $value) { + $filter[$j] = $this->bind($value); + } + + $filters[$i] = vsprintf($format, $filter); + } + } + + $query->where($filters); + + //run the query + $this->query($query, $this->getBinds()); + + $this->trigger($table, $filters); + + return $this; + } + + /** + * Returns all the bound values of this query + * + * @param void + * @return array + */ + public function getBinds() { + return $this->_binds; + } + + /** + * Returns a collection given the query parameters + * + * @param string table + * @param array joins + * @param array filter + * @param array sort + * @param int start + * @param int range + * @return array + */ + public function getCollection($table, array $joins = array(), $filters = NULL, + array $sort = array(), $start = 0, $range = 0, $index = NULL) { + //argument test + Eden_Sql_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(3, 'string', 'array', 'null') //Argument 3 must be a string number or null + ->argument(5, 'numeric') //Argument 5 must be a number + ->argument(6, 'numeric') //Argument 6 must be a number + ->argument(7, 'numeric', 'null'); //Argument 7 must be a number or null + + $results = $this->getRows($table, $joins, $filters, $sort, $start, $range, $index); + + $collection = $this->collection() + ->setTable($table) + ->setModel($this->_model); + + if(is_null($results)) { + return $collection; + } + + if(!is_null($index)) { + return $this->model($results)->setTable($table); + } + + return $collection->set($results); + } + + /** + * Returns the connection object + * if no connection has been made + * it will attempt to make it + * + * @param array connection options + * @return PDO connection resource + */ + public function getConnection() { + if(!$this->_connection) { + $this->connect(); + } + + return $this->_connection; + } + + /** + * Returns the last inserted id + * + * @return int the id + */ + public function getLastInsertedId() { + return $this->getConnection()->lastInsertId(); + } + + /** + * Returns a model given the column name and the value + * + * @param string table + * @param string name + * @param string value + * @return array|NULL + */ + public function getModel($table, $name, $value) { + //argument test + Eden_Sql_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string', 'numeric'); //Argument 3 must be a string or number + + $result = $this->getRow($table, $name, $value); + + $model = $this->model()->setTable($table); + + if(is_null($result)) { + return $model; + } + + return $model->set($result); + } + + /** + * Returns the history of queries made still in memory + * + * @return array the queries + */ + public function getQueries($index = NULL) { + if(is_null($index)) { + return $this->_queries; + } + + if($index == self::FIRST) { + $index = 0; + } + + if($index == self::LAST) { + $index = count($this->_queries) - 1; + } + + if(isset($this->_queries[$index])) { + return $this->_queries[$index]; + } + + return NULL; + } + + /** + * Returns a 1 row result given the column name and the value + * + * @param string table + * @param string name + * @param string value + * @return array + */ + public function getRow($table, $name, $value) { + //argument test + Eden_Sql_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string', 'numeric'); //Argument 3 must be a string or number + + $query = $this->select() + ->from($table) + ->where($name.' = '.$this->bind($value)) + ->limit(0, 1); + + $results = $this->query($query, $this->getBinds()); + + $this->trigger($table, $name, $value, $results); + + return isset($results[0]) ? $results[0] : NULL; + } + + /** + * Returns a list of results given the query parameters + * + * @param string table + * @param array joins + * @param array filter + * @param array sort + * @param int start + * @param int range + * @return array + */ + public function getRows($table, array $joins = array(), $filters = NULL, + array $sort = array(), $start = 0, $range = 0, $index = NULL) { + //argument test + Eden_Sql_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(3, 'string', 'array', 'null') //Argument 3 must be a string number or null + ->argument(5, 'numeric') //Argument 5 must be a number + ->argument(6, 'numeric') //Argument 6 must be a number + ->argument(7, 'numeric', 'null'); //Argument 7 must be a number or null + + $query = $this->select()->from($table); + + foreach($joins as $join) { + if(!is_array($join) || count($join) < 3) { + continue; + } + + if(count($join) == 3) { + $join[] = true; + } + + $query->join($join[0], $join[1], $join[2], $join[3]); + } + + if(is_array($filters)) { + foreach($filters as $i => $filter) { + //array('post_id=%s AND post_title IN %s', 123, array('asd')); + $format = array_shift($filter); + + foreach($filter as $j => $value) { + $filter[$j] = $this->bind($value); + } + + $filters[$i] = vsprintf($format, $filter); + } + } + + if(!is_null($filters)) { + $query->where($filters); + } + + if(!empty($sort)) { + foreach($sort as $key => $value) { + if(is_string($key) && trim($key)) { + $query->sortBy($key, $value); + } + } + } + + if($range) { + $query->limit($start, $range); + } + + $results = $this->query($query, $this->getBinds()); + + if(!is_null($index)) { + if(empty($results)) { + $results = NULL; + } else { + if($index == self::FIRST) { + $index = 0; + } + + if($index == self::LAST) { + $index = count($results)-1; + } + + if(isset($results[$index])) { + $results = $results[$index]; + } else { + $results = NULL; + } + } + } + + $this->trigger($table, $joins, $filters, $sort, $start, $range, $index, $results); + + return $results; + } + + /** + * Returns the number of results given the query parameters + * + * @param string table + * @param array filter + * @return int | false + */ + public function getRowsCount($table, array $joins = array(), $filters = NULL) { + //argument test + Eden_Sql_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(3, 'string', 'array', 'null'); //Argument 3 must be a string number or null + + $query = $this->select('COUNT(*) as count')->from($table); + + foreach($joins as $join) { + if(!is_array($join) || count($join) < 3) { + continue; + } + + if(count($join) == 3) { + $join[] = true; + } + + $query->join($join[0], $join[1], $join[2], $join[3]); + } + + if(is_array($filters)) { + foreach($filters as $i => $filter) { + //array('post_id=%s AND post_title IN %s', 123, array('asd')); + $format = array_shift($filter); + $filter = $this->bind($filter); + $filters[$i] = vsprintf($format, $filter); + } + } + + $query->where($filters); + + $results = $this->query($query, $this->getBinds()); + + if(isset($results[0]['count'])) { + $this->trigger($table, $joins, $filters, $results[0]['count']); + return $results[0]['count']; + } + + $this->trigger($table, $joins, $filters, false); + + return false; + } + + /** + * Returns the insert query builder + * + * @return Eden_Sql_Insert + */ + public function insert($table = NULL) { + //Argument 1 must be a string or null + Eden_Sql_Error::i()->argument(1, 'string', 'null'); + + return Eden_Sql_Insert::i($table); + } + + /** + * Inserts data into a table and returns the ID + * + * @param string table + * @param array setting + * @return int + */ + public function insertRow($table, array $setting, $bind = true) { + //Argument 1 must be a string + Eden_Sql_Error::i()->argument(1, 'string')->argument(3, 'array', 'bool'); + + $query = $this->insert($table); + + foreach($setting as $key => $value) { + if(is_null($value) || is_bool($value)) { + $query->set($key, $value); + continue; + } + + if((is_bool($bind) && $bind) || (is_array($bind) && in_array($key, $bind))) { + $value = $this->bind($value); + } + + $query->set($key, $value); + } + + //run the query + $this->query($query, $this->getBinds()); + + $this->trigger($table, $setting); + + return $this; + } + + /** + * Inserts multiple rows into a table + * + * @param string table + * @param array settings + * @return void + */ + public function insertRows($table, array $settings, $bind = true) { + //Argument 1 must be a string + Eden_Sql_Error::i()->argument(1, 'string')->argument(3, 'array', 'bool'); + + $query = $this->insert($table); + + foreach($settings as $index => $setting) { + foreach($setting as $key => $value) { + if(is_null($value) || is_bool($value)) { + $query->set($key, $value); + continue; + } + + if((is_bool($bind) && $bind) || (is_array($bind) && in_array($key, $bind))) { + $value = $this->bind($value); + } + + $query->set($key, $value, $index); + } + } + + //run the query + $this->query($query, $this->getBinds()); + + $this->trigger($table, $settings); + + return $this; + } + + /** + * Returns model + * + * @return Eden_Sql_Model + */ + public function model(array $data = array()) { + $model = $this->_model; + return $this->$model($data)->setDatabase($this); + } + + /** + * Queries the database + * + * @param string query + * @param array binded value + * @return array|object + */ + public function query($query, array $binds = array()) { + //Argument 1 must be a string or null + Eden_Sql_Error::i()->argument(1, 'string', self::QUERY); + + $connection = $this->getConnection(); + $query = (string) $query; + $stmt = $connection->prepare($query); + + foreach($binds as $key => $value) { + $stmt->bindValue($key, $value); + } + + if(!$stmt->execute()) { + $error = $stmt->errorInfo(); + + foreach($binds as $key => $value) { + $query = str_replace($key, "'$value'", $query); + } + + Eden_Sql_Error::i() + ->setMessage(Eden_Sql_Error::QUERY_ERROR) + ->addVariable($query) + ->addVariable($error[2]) + ->trigger(); + } + + $results = $stmt->fetchAll( PDO::FETCH_ASSOC ); + + $this->_queries[] = array( + 'query' => $query, + 'binds' => $binds, + 'results' => $results); + + $this->_binds = array(); + + $this->trigger($query, $binds, $results); + + return $results; + } + + /** + * Returns search + * + * @return Eden_Sql_Search + */ + public function search($table = NULL) { + //Argument 1 must be a string or null + Eden_Sql_Error::i()->argument(1, 'string', 'null'); + + $search = Eden_Sql_Search::i($this) + ->setCollection($this->_collection) + ->setModel($this->_model); + + if($table) { + $search->setTable($table); + } + + return $search; + } + + /** + * Returns the select query builder + * + * @return Eden_Sql_Select + */ + public function select($select = '*') { + //Argument 1 must be a string or array + Eden_Sql_Error::i()->argument(1, 'string', 'array'); + + return Eden_Sql_Select::i($select); + } + + /** + * Sets all the bound values of this query + * + * @param array + * @return this + */ + public function setBinds(array $binds) { + $this->_binds = $binds; + return $this; + } + + /** + * Sets default collection + * + * @param string + * @return this + */ + public function setCollection($collection) { + $error = Eden_Sql_Error::i()->argument(1, 'string'); + + if(!is_subclass_of($collection, self::COLLECTION)) { + $error->setMessage(Eden_Sql_Error::NOT_SUB_COLLECTION) + ->addVariable($collection) + ->trigger(); + } + + $this->_collection = $collection; + return $this; + } + + /** + * Sets the default model + * + * @param string + * @return this + */ + public function setModel($model) { + $error = Eden_Sql_Error::i()->argument(1, 'string'); + + if(!is_subclass_of($model, self::MODEL)) { + $error->setMessage(Eden_Sql_Error::NOT_SUB_MODEL) + ->addVariable($model) + ->trigger(); + } + + $this->_model = $model; + return $this; + } + + /** + * Sets only 1 row given the column name and the value + * + * @param string table + * @param string name + * @param string value + * @param array setting + * @return var + */ + public function setRow($table, $name, $value, array $setting) { + //argument test + Eden_Sql_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string', 'numeric'); //Argument 3 must be a string or number + + //first check to see if the row exists + $row = $this->getRow($table, $name, $value); + + if(!$row) { + //we need to insert + $setting[$name] = $value; + return $this->insertRow($table, $setting); + } else { + //we need to update this row + return $this->updateRows($table, $setting, array(array($name.'=%s', $value))); + } + } + + /** + * Returns the update query builder + * + * @return Eden_Sql_Update + */ + public function update($table = NULL) { + //Argument 1 must be a string or null + Eden_Sql_Error::i()->argument(1, 'string', 'null'); + + return Eden_Sql_Update::i($table); + } + + /** + * Updates rows that match a filter given the update settings + * + * @param string table + * @param array setting + * @param array filter + * @return var + */ + public function updateRows($table, array $setting, $filters = NULL, $bind = true) { + //Argument 1 must be a string + Eden_Sql_Error::i()->argument(1, 'string')->argument(4, 'array', 'bool'); + + $query = $this->update($table); + + foreach($setting as $key => $value) { + if(is_null($value) || is_bool($value)) { + $query->set($key, $value); + continue; + } + + if((is_bool($bind) && $bind) || (is_array($bind) && in_array($key, $bind))) { + $value = $this->bind($value); + } + + $query->set($key, $value); + } + + if(is_array($filters)) { + foreach($filters as $i => $filter) { + //array('post_id=%s AND post_title IN %s', 123, array('asd')); + $format = array_shift($filter); + + foreach($filter as $j => $value) { + $filter[$j] = $this->bind($value); + } + + $filters[$i] = vsprintf($format, $filter); + } + } + + $query->where($filters); + + //run the query + $this->query($query, $this->getBinds()); + + $this->trigger($table, $setting, $filters); + + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/sql/error.php b/library/eden/sql/error.php index 0789807..b6dac34 100755 --- a/library/eden/sql/error.php +++ b/library/eden/sql/error.php @@ -1,46 +1,46 @@ - -/* - * This file is part of the Eden package. - * (c) 2010-2012 Christian Blanquera - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Sql Errors - * - * @package Eden - * @category sql - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Sql_Error extends Eden_Error { - /* Constants - -------------------------------*/ - const QUERY_ERROR = '%s Query: %s'; - const TABLE_NOT_SET = 'No default table set or was passed.'; - const DATABASE_NOT_SET = 'No default database set or was passed.'; - - const NOT_SUB_MODEL = 'Class %s is not a child of Eden_Model'; - const NOT_SUB_COLLECTION = 'Class %s is not a child of Eden_Collection'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2010-2012 Christian Blanquera + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Sql Errors + * + * @package Eden + * @category sql + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Sql_Error extends Eden_Error { + /* Constants + -------------------------------*/ + const QUERY_ERROR = '%s Query: %s'; + const TABLE_NOT_SET = 'No default table set or was passed.'; + const DATABASE_NOT_SET = 'No default database set or was passed.'; + + const NOT_SUB_MODEL = 'Class %s is not a child of Eden_Model'; + const NOT_SUB_COLLECTION = 'Class %s is not a child of Eden_Collection'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/sql/model.php b/library/eden/sql/model.php index f3dbba1..45355b8 100644 --- a/library/eden/sql/model.php +++ b/library/eden/sql/model.php @@ -1,423 +1,423 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Sql Model - * - * @package Eden - * @category sql - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Sql_Model extends Eden_Model { - /* Constants - -------------------------------*/ - const COLUMNS = 'columns'; - const PRIMARY = 'primary'; - const DATETIME = 'Y-m-d h:i:s'; - const DATE = 'Y-m-d'; - const TIME = 'h:i:s'; - const TIMESTAMP = 'U'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_table = NULL; - protected $_database = NULL; - - protected static $_meta = array(); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Useful method for formating a time column. - * - * @param string - * @param string - * @return this - */ - public function formatTime($column, $format = self::DATETIME) { - //Argument Test - Eden_Sql_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string'); //Argument 1 must be a string - - //if the column isn't set - if(!isset($this->_data[$column])) { - //do nothing more - return $this; - } - - //if this is column is a string - if(is_string($this->_data[$column])) { - //make into time - $this->_data[$column] = strtotime($this->_data[$column]); - } - - //if this column is not an integer - if(!is_int($this->_data[$column])) { - //do nothing more - return $this; - } - - //set it - $this->_data[$column] = date($format, $this->_data[$column]); - - return $this; - } - - /** - * Inserts model to database - * - * @param string - * @param Eden_Sql_Database - * @return this - */ - public function insert($table = NULL, Eden_Sql_Database $database = NULL) { - //Argument 1 must be a string - $error = Eden_Sql_Error::i()->argument(1, 'string', 'null'); - - //if no table - if(is_null($table)) { - //if no default table either - if(!$this->_table) { - //throw error - $error->setMessage(Eden_Sql_Error::TABLE_NOT_SET)->trigger(); - } - - $table = $this->_table; - } - - //if no database - if(is_null($database)) { - //and no default database - if(!$this->_database) { - $error->setMessage(Eden_Sql_Error::DATABASE_NOT_SET)->trigger(); - } - - $database = $this->_database; - } - - //get the meta data, the valid column values and whether is primary is set - $meta = $this->_getMeta($table, $database); - $data = $this->_getValidColumns(array_keys($meta[self::COLUMNS])); - - //update original data - $this->_original = $this->_data; - - //we insert it - $database->insertRow($table, $data); - - //only if we have 1 primary key - if(count($meta[self::PRIMARY]) == 1) { - //set the primary key - $this->_data[$meta[self::PRIMARY][0]] = $database->getLastInsertedId(); - } - - return $this; - } - - /** - * Removes model from database - * - * @param string - * @param Eden_Sql_Database - * @param string|array|null - * @return this - */ - public function remove($table = NULL, Eden_Sql_Database $database = NULL, $primary = NULL) { - //Argument 1 must be a string - $error = Eden_Sql_Error::i()->argument(1, 'string', 'null'); - - //if no table - if(is_null($table)) { - //if no default table either - if(!$this->_table) { - //throw error - $error->setMessage(Eden_Sql_Error::TABLE_NOT_SET)->trigger(); - } - - $table = $this->_table; - } - - //if no database - if(is_null($database)) { - //and no default database - if(!$this->_database) { - $error->setMessage(Eden_Sql_Error::DATABASE_NOT_SET)->trigger(); - } - - $database = $this->_database; - } - - //get the meta data and valid columns - $meta = $this->_getMeta($table, $database); - $data = $this->_getValidColumns(array_keys($meta[self::COLUMNS])); - - if(is_null($primary)) { - $primary = $meta[self::PRIMARY]; - } - - if(is_string($primary)) { - $primary = array($primary); - } - - $filter = array(); - //for each primary key - foreach($primary as $column) { - //if the primary is not set - if(!isset($data[$column])) { - //we can't do a remove - //do nothing more - return $this; - } - - //add the condition to the filter - $filter[] = array($column.'=%s', $data[$column]); - } - - //we delete it - $database->deleteRows($table, $filter); - - return $this; - } - - /** - * Inserts or updates model to database - * - * @param string - * @param Eden_Sql_Database - * @param string|array|null - * @return this - */ - public function save($table = NULL, Eden_Sql_Database $database = NULL, $primary = NULL) { - //Argument 1 must be a string - $error = Eden_Sql_Error::i()->argument(1, 'string', 'null'); - - //if no table - if(is_null($table)) { - //if no default table either - if(!$this->_table) { - //throw error - $error->setMessage(Eden_Sql_Error::TABLE_NOT_SET)->trigger(); - } - - $table = $this->_table; - } - - //if no database - if(is_null($database)) { - //and no default database - if(!$this->_database) { - $error->setMessage(Eden_Sql_Error::DATABASE_NOT_SET)->trigger(); - } - - $database = $this->_database; - } - - //get the meta data, the valid column values and whether is primary is set - $meta = $this->_getMeta($table, $database); - - if(is_null($primary)) { - $primary = $meta[self::PRIMARY]; - } - - if(is_string($primary)) { - $primary = array($primary); - } - - $primarySet = $this->_isPrimarySet($primary); - - //update original data - $this->_original = $this->_data; - - //if no primary meta or primary values are not set - if(empty($primary) || !$primarySet) { - return $this->insert($table, $database); - } - - return $this->update($table, $database, $primary); - } - - /** - * Sets the default database - * - * @param Eden_Sql - */ - public function setDatabase(Eden_Sql_Database $database) { - $this->_database = $database; - return $this; - } - - /** - * Sets the default database - * - * @param string - */ - public function setTable($table) { - //Argument 1 must be a string - Eden_Sql_Error::i()->argument(1, 'string'); - - $this->_table = $table; - return $this; - } - - /** - * Updates model to database - * - * @param string - * @param Eden_Sql_Database - * @param string|array|null - * @return this - */ - public function update($table = NULL, Eden_Sql_Database $database = NULL, $primary = NULL) { - //Argument 1 must be a string - $error = Eden_Sql_Error::i()->argument(1, 'string', 'null'); - - //if no table - if(is_null($table)) { - //if no default table either - if(!$this->_table) { - //throw error - $error->setMessage(Eden_Sql_Error::TABLE_NOT_SET)->trigger(); - } - - $table = $this->_table; - } - - //if no database - if(is_null($database)) { - //and no default database - if(!$this->_database) { - $error->setMessage(Eden_Sql_Error::DATABASE_NOT_SET)->trigger(); - } - - $database = $this->_database; - } - - //get the meta data, the valid column values and whether is primary is set - $meta = $this->_getMeta($table, $database); - $data = $this->_getValidColumns(array_keys($meta[self::COLUMNS])); - - //update original data - $this->_original = $this->_data; - - //from here it means that this table has primary - //columns and all primary values are set - - if(is_null($primary)) { - $primary = $meta[self::PRIMARY]; - } - - if(is_string($primary)) { - $primary = array($primary); - } - - $filter = array(); - //for each primary key - foreach($primary as $column) { - //add the condition to the filter - $filter[] = array($column.'=%s', $data[$column]); - } - - //we update it - $database->updateRows($table, $data, $filter); - - return $this; - } - - /* Protected Methods - -------------------------------*/ - protected function _isLoaded($table = NULL, $database = NULL) { - //if no table - if(is_null($table)) { - //if no default table either - if(!$this->_table) { - return false; - } - - $table = $this->_table; - } - - //if no database - if(is_null($database)) { - //and no default database - if(!$this->_database) { - return false; - } - - $database = $this->_database; - } - - $meta = $this->_getMeta($table, $database); - - return $this->_isPrimarySet($meta[self::PRIMARY]); - } - - protected function _isPrimarySet(array $primary) { - foreach($primary as $column) { - if(is_null($this[$column])) { - return false; - } - } - - return true; - } - - protected function _getMeta($table, $database) { - $uid = spl_object_hash($database); - if(isset(self::$_meta[$uid][$table])) { - return self::$_meta[$uid][$table]; - } - - $columns = $database->getColumns($table); - - $meta = array(); - foreach($columns as $i => $column) { - $meta[self::COLUMNS][$column['Field']] = array( - 'type' => $column['Type'], - 'key' => $column['Key'], - 'default' => $column['Default'], - 'empty' => $column['Null'] == 'YES'); - - if($column['Key'] == 'PRI') { - $meta[self::PRIMARY][] = $column['Field']; - } - } - - self::$_meta[$uid][$table] = $meta; - - return $meta; - } - - protected function _getValidColumns($columns) { - $valid = array(); - foreach($columns as $column) { - if(!isset($this->_data[$column])) { - continue; - } - - $valid[$column] = $this->_data[$column]; - } - - return $valid; - } - - /* Private Methods - -------------------------------*/ -} - + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Sql Model + * + * @package Eden + * @category sql + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Sql_Model extends Eden_Model { + /* Constants + -------------------------------*/ + const COLUMNS = 'columns'; + const PRIMARY = 'primary'; + const DATETIME = 'Y-m-d h:i:s'; + const DATE = 'Y-m-d'; + const TIME = 'h:i:s'; + const TIMESTAMP = 'U'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_table = NULL; + protected $_database = NULL; + + protected static $_meta = array(); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Useful method for formating a time column. + * + * @param string + * @param string + * @return this + */ + public function formatTime($column, $format = self::DATETIME) { + //Argument Test + Eden_Sql_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string'); //Argument 1 must be a string + + //if the column isn't set + if(!isset($this->_data[$column])) { + //do nothing more + return $this; + } + + //if this is column is a string + if(is_string($this->_data[$column])) { + //make into time + $this->_data[$column] = strtotime($this->_data[$column]); + } + + //if this column is not an integer + if(!is_int($this->_data[$column])) { + //do nothing more + return $this; + } + + //set it + $this->_data[$column] = date($format, $this->_data[$column]); + + return $this; + } + + /** + * Inserts model to database + * + * @param string + * @param Eden_Sql_Database + * @return this + */ + public function insert($table = NULL, Eden_Sql_Database $database = NULL) { + //Argument 1 must be a string + $error = Eden_Sql_Error::i()->argument(1, 'string', 'null'); + + //if no table + if(is_null($table)) { + //if no default table either + if(!$this->_table) { + //throw error + $error->setMessage(Eden_Sql_Error::TABLE_NOT_SET)->trigger(); + } + + $table = $this->_table; + } + + //if no database + if(is_null($database)) { + //and no default database + if(!$this->_database) { + $error->setMessage(Eden_Sql_Error::DATABASE_NOT_SET)->trigger(); + } + + $database = $this->_database; + } + + //get the meta data, the valid column values and whether is primary is set + $meta = $this->_getMeta($table, $database); + $data = $this->_getValidColumns(array_keys($meta[self::COLUMNS])); + + //update original data + $this->_original = $this->_data; + + //we insert it + $database->insertRow($table, $data); + + //only if we have 1 primary key + if(count($meta[self::PRIMARY]) == 1) { + //set the primary key + $this->_data[$meta[self::PRIMARY][0]] = $database->getLastInsertedId(); + } + + return $this; + } + + /** + * Removes model from database + * + * @param string + * @param Eden_Sql_Database + * @param string|array|null + * @return this + */ + public function remove($table = NULL, Eden_Sql_Database $database = NULL, $primary = NULL) { + //Argument 1 must be a string + $error = Eden_Sql_Error::i()->argument(1, 'string', 'null'); + + //if no table + if(is_null($table)) { + //if no default table either + if(!$this->_table) { + //throw error + $error->setMessage(Eden_Sql_Error::TABLE_NOT_SET)->trigger(); + } + + $table = $this->_table; + } + + //if no database + if(is_null($database)) { + //and no default database + if(!$this->_database) { + $error->setMessage(Eden_Sql_Error::DATABASE_NOT_SET)->trigger(); + } + + $database = $this->_database; + } + + //get the meta data and valid columns + $meta = $this->_getMeta($table, $database); + $data = $this->_getValidColumns(array_keys($meta[self::COLUMNS])); + + if(is_null($primary)) { + $primary = $meta[self::PRIMARY]; + } + + if(is_string($primary)) { + $primary = array($primary); + } + + $filter = array(); + //for each primary key + foreach($primary as $column) { + //if the primary is not set + if(!isset($data[$column])) { + //we can't do a remove + //do nothing more + return $this; + } + + //add the condition to the filter + $filter[] = array($column.'=%s', $data[$column]); + } + + //we delete it + $database->deleteRows($table, $filter); + + return $this; + } + + /** + * Inserts or updates model to database + * + * @param string + * @param Eden_Sql_Database + * @param string|array|null + * @return this + */ + public function save($table = NULL, Eden_Sql_Database $database = NULL, $primary = NULL) { + //Argument 1 must be a string + $error = Eden_Sql_Error::i()->argument(1, 'string', 'null'); + + //if no table + if(is_null($table)) { + //if no default table either + if(!$this->_table) { + //throw error + $error->setMessage(Eden_Sql_Error::TABLE_NOT_SET)->trigger(); + } + + $table = $this->_table; + } + + //if no database + if(is_null($database)) { + //and no default database + if(!$this->_database) { + $error->setMessage(Eden_Sql_Error::DATABASE_NOT_SET)->trigger(); + } + + $database = $this->_database; + } + + //get the meta data, the valid column values and whether is primary is set + $meta = $this->_getMeta($table, $database); + + if(is_null($primary)) { + $primary = $meta[self::PRIMARY]; + } + + if(is_string($primary)) { + $primary = array($primary); + } + + $primarySet = $this->_isPrimarySet($primary); + + //update original data + $this->_original = $this->_data; + + //if no primary meta or primary values are not set + if(empty($primary) || !$primarySet) { + return $this->insert($table, $database); + } + + return $this->update($table, $database, $primary); + } + + /** + * Sets the default database + * + * @param Eden_Sql + */ + public function setDatabase(Eden_Sql_Database $database) { + $this->_database = $database; + return $this; + } + + /** + * Sets the default database + * + * @param string + */ + public function setTable($table) { + //Argument 1 must be a string + Eden_Sql_Error::i()->argument(1, 'string'); + + $this->_table = $table; + return $this; + } + + /** + * Updates model to database + * + * @param string + * @param Eden_Sql_Database + * @param string|array|null + * @return this + */ + public function update($table = NULL, Eden_Sql_Database $database = NULL, $primary = NULL) { + //Argument 1 must be a string + $error = Eden_Sql_Error::i()->argument(1, 'string', 'null'); + + //if no table + if(is_null($table)) { + //if no default table either + if(!$this->_table) { + //throw error + $error->setMessage(Eden_Sql_Error::TABLE_NOT_SET)->trigger(); + } + + $table = $this->_table; + } + + //if no database + if(is_null($database)) { + //and no default database + if(!$this->_database) { + $error->setMessage(Eden_Sql_Error::DATABASE_NOT_SET)->trigger(); + } + + $database = $this->_database; + } + + //get the meta data, the valid column values and whether is primary is set + $meta = $this->_getMeta($table, $database); + $data = $this->_getValidColumns(array_keys($meta[self::COLUMNS])); + + //update original data + $this->_original = $this->_data; + + //from here it means that this table has primary + //columns and all primary values are set + + if(is_null($primary)) { + $primary = $meta[self::PRIMARY]; + } + + if(is_string($primary)) { + $primary = array($primary); + } + + $filter = array(); + //for each primary key + foreach($primary as $column) { + //add the condition to the filter + $filter[] = array($column.'=%s', $data[$column]); + } + + //we update it + $database->updateRows($table, $data, $filter); + + return $this; + } + + /* Protected Methods + -------------------------------*/ + protected function _isLoaded($table = NULL, $database = NULL) { + //if no table + if(is_null($table)) { + //if no default table either + if(!$this->_table) { + return false; + } + + $table = $this->_table; + } + + //if no database + if(is_null($database)) { + //and no default database + if(!$this->_database) { + return false; + } + + $database = $this->_database; + } + + $meta = $this->_getMeta($table, $database); + + return $this->_isPrimarySet($meta[self::PRIMARY]); + } + + protected function _isPrimarySet(array $primary) { + foreach($primary as $column) { + if(is_null($this[$column])) { + return false; + } + } + + return true; + } + + protected function _getMeta($table, $database) { + $uid = spl_object_hash($database); + if(isset(self::$_meta[$uid][$table])) { + return self::$_meta[$uid][$table]; + } + + $columns = $database->getColumns($table); + + $meta = array(); + foreach($columns as $i => $column) { + $meta[self::COLUMNS][$column['Field']] = array( + 'type' => $column['Type'], + 'key' => $column['Key'], + 'default' => $column['Default'], + 'empty' => $column['Null'] == 'YES'); + + if($column['Key'] == 'PRI') { + $meta[self::PRIMARY][] = $column['Field']; + } + } + + self::$_meta[$uid][$table] = $meta; + + return $meta; + } + + protected function _getValidColumns($columns) { + $valid = array(); + foreach($columns as $column) { + if(!isset($this->_data[$column])) { + continue; + } + + $valid[$column] = $this->_data[$column]; + } + + return $valid; + } + + /* Private Methods + -------------------------------*/ +} + diff --git a/library/eden/sql/query.php b/library/eden/sql/query.php index d5bc653..5fb3416 100755 --- a/library/eden/sql/query.php +++ b/library/eden/sql/query.php @@ -1,49 +1,49 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Generates select query string syntax - * - * @package Eden - * @category sql - * @author Christian Blanquera cblanquera@openovate.com - */ -abstract class Eden_Sql_Query extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - /* Magic - -------------------------------*/ - public function __toString() { - return $this->getQuery(); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns the string version of the query - * - * @param bool - * @return string - * @notes returns the query based on the registry - */ - abstract public function getQuery(); - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Generates select query string syntax + * + * @package Eden + * @category sql + * @author Christian Blanquera cblanquera@openovate.com + */ +abstract class Eden_Sql_Query extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + /* Magic + -------------------------------*/ + public function __toString() { + return $this->getQuery(); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns the string version of the query + * + * @param bool + * @return string + * @notes returns the query based on the registry + */ + abstract public function getQuery(); + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/sql/search.php b/library/eden/sql/search.php index e6b982c..843a0dc 100644 --- a/library/eden/sql/search.php +++ b/library/eden/sql/search.php @@ -1,749 +1,749 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Sql Search - * - * @package Eden - * @category sql - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Sql_Search extends Eden_Class { - /* Constants - -------------------------------*/ - const LEFT = 'LEFT'; - const RIGHT = 'RIGHT'; - const INNER = 'INNER'; - const OUTER = 'OUTER'; - const ASC = 'ASC'; - const DESC = 'DESC'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_database = NULL; - protected $_table = NULL; - protected $_columns = array(); - protected $_join = array(); - protected $_filter = array(); - protected $_sort = array(); - protected $_group = array(); - protected $_start = 0; - protected $_range = 0; - - protected $_model = Eden_Sql_Database::MODEL; - protected $_collection = Eden_Sql_Database::COLLECTION; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __call($name, $args) { - if(strpos($name, 'filterBy') === 0) { - //filterByUserName('Chris', '-') - $separator = '_'; - if(isset($args[1]) && is_scalar($args[1])) { - $separator = (string) $args[1]; - } - - $key = Eden_Type_String::i($name) - ->substr(8) - ->preg_replace("/([A-Z0-9])/", $separator."$1") - ->substr(strlen($separator)) - ->strtolower() - ->get(); - - if(!isset($args[0])) { - $args[0] = NULL; - } - - $key = $key.'=%s'; - - $this->addFilter($key, $args[0]); - - return $this; - } - - if(strpos($name, 'sortBy') === 0) { - //filterByUserName('Chris', '-') - $separator = '_'; - if(isset($args[1]) && is_scalar($args[1])) { - $separator = (string) $args[1]; - } - - $key = Eden_Type_String::i($name) - ->substr(6) - ->preg_replace("/([A-Z0-9])/", $separator."$1") - ->substr(strlen($separator)) - ->strtolower() - ->get(); - - if(!isset($args[0])) { - $args[0] = self::ASC; - } - - $this->addSort($key, $args[0]); - - return $this; - } - - try { - return parent::__call($name, $args); - } catch(Eden_Error $e) { - Eden_Sql_Error::i($e->getMessage())->trigger(); - } - } - - public function __construct(Eden_Sql_Database $database) { - $this->_database = $database; - } - - /* Public Methods - -------------------------------*/ - - /** - * Adds filter - * - * @param string - * @param string[,string..] - * @return this - */ - public function addFilter() { - Eden_Sql_Error::i()->argument(1, 'string'); - - $this->_filter[] = func_get_args(); - - return $this; - } - - /** - * Adds Inner Join On - * - * @param string - * @param string[,string..] - * @return this - */ - public function addInnerJoinOn($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::INNER, $table, $where, false); - - return $this; - } - - /** - * Adds Inner Join Using - * - * @param string - * @param string[,string..] - * @return this - */ - public function addInnerJoinUsing($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::INNER, $table, $where, true); - - return $this; - } - - /** - * Adds Left Join On - * - * @param string - * @param string[,string..] - * @return this - */ - public function addLeftJoinOn($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::LEFT, $table, $where, false); - - return $this; - } - - /** - * Adds Left Join Using - * - * @param string - * @param string[,string..] - * @return this - */ - public function addLeftJoinUsing($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::LEFT, $table, $where, true); - - return $this; - } - - /** - * Adds Outer Join On - * - * @param string - * @param string[,string..] - * @return this - */ - public function addOuterJoinOn($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::OUTER, $table, $where, false); - - return $this; - } - - /** - * Adds Outer Join USing - * - * @param string - * @param string[,string..] - * @return this - */ - public function addOuterJoinUsing($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::OUTER, $table, $where, true); - - return $this; - } - - /** - * Adds Right Join On - * - * @param string - * @param string[,string..] - * @return this - */ - public function addRightJoinOn($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::RIGHT, $table, $where, false); - - return $this; - } - - /** - * Adds Right Join Using - * - * @param string - * @param string[,string..] - * @return this - */ - public function addRightJoinUsing($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::RIGHT, $table, $where, true); - - return $this; - } - - /** - * Adds sort - * - * @param string - * @param string - * @return this - */ - public function addSort($column, $order = self::ASC) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - if($order != self::DESC) { - $order = self::ASC; - } - - $this->_sort[$column] = $order; - - return $this; - } - - /** - * Returns the results in a collection - * - * @return Eden_Sql_Collection - */ - public function getCollection() { - $collection = $this->_collection; - return $this->$collection() - ->setDatabase($this->_database) - ->setTable($this->_table) - ->setModel($this->_model) - ->set($this->getRows()); - } - - /** - * Returns the one result in a model - * - * @param int - * @return Eden_Sql_Model - */ - public function getModel($index = 0) { - Eden_Sql_Error::i()->argument(1, 'int'); - return $this->getCollection()->offsetGet($index); - } - - /** - * Returns the one result - * - * @param int|string - * @param string|null - * @return array|null - */ - public function getRow($index = 0, $column = NULL) { - Eden_Sql_Error::i() - ->argument(1, 'int', 'string') - ->argument(2, 'string', 'null'); - - if(is_string($index)) { - $column = $index; - $index = 0; - } - - $rows = $this->getRows(); - - if(!is_null($column) && isset($rows[$index][$column])) { - return $rows[$index][$column]; - } else if(is_null($column) && isset($rows[$index])) { - return $rows[$index]; - } - - return NULL; - } - - /** - * Returns the array rows - * - * @return array - */ - public function getRows() { - $query = $this->_getQuery(); - - if(!empty($this->_columns)) { - $query->select(implode(', ', $this->_columns)); - } - - foreach($this->_sort as $key => $value) { - $query->sortBy($key, $value); - } - - if($this->_range) { - $query->limit($this->_start, $this->_range); - } - - if(!empty($this->_group)) { - $query->groupBy($this->_group); - } - - return $this->_database->query($query, $this->_database->getBinds()); - } - - /** - * Returns the total results - * - * @return int - */ - public function getTotal() { - $query = $this->_getQuery()->select('COUNT(*) as total'); - - $rows = $this->_database->query($query, $this->_database->getBinds()); - - if(!isset($rows[0]['total'])) { - return 0; - } - - return $rows[0]['total']; - } - - /** - * Adds Inner Join On - * - * @param string - * @param string[,string..] - * @return this - */ - public function innerJoinOn($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::INNER, $table, $where, false); - - return $this; - } - - /** - * Adds Inner Join Using - * - * @param string - * @param string[,string..] - * @return this - */ - public function innerJoinUsing($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::INNER, $table, $where, true); - - return $this; - } - - /** - * Adds Left Join On - * - * @param string - * @param string[,string..] - * @return this - */ - public function leftJoinOn($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::LEFT, $table, $where, false); - - return $this; - } - - /** - * Adds Left Join Using - * - * @param string - * @param string[,string..] - * @return this - */ - public function leftJoinUsing($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::LEFT, $table, $where, true); - - return $this; - } - - /** - * Adds Outer Join On - * - * @param string - * @param string[,string..] - * @return this - */ - public function outerJoinOn($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::OUTER, $table, $where, false); - - return $this; - } - - /** - * Adds Outer Join USing - * - * @param string - * @param string[,string..] - * @return this - */ - public function outerJoinUsing($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::OUTER, $table, $where, true); - - return $this; - } - - /** - * Adds Right Join On - * - * @param string - * @param string[,string..] - * @return this - */ - public function rightJoinOn($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::RIGHT, $table, $where, false); - - return $this; - } - - /** - * Adds Right Join Using - * - * @param string - * @param string[,string..] - * @return this - */ - public function rightJoinUsing($table, $where) { - Eden_Sql_Error::i() - ->argument(1, 'string') - ->argument(2, 'string'); - - $where = func_get_args(); - $table = array_shift($where); - - $this->_join[] = array(self::RIGHT, $table, $where, true); - - return $this; - } - - /** - * Sets Columns - * - * @param string[,string..]|array - * @return this - */ - public function setColumns($columns) { - if(!is_array($columns)) { - $columns = func_get_args(); - } - - $this->_columns = $columns; - - return $this; - } - - /** - * Sets default collection - * - * @param string - * @return this - */ - public function setCollection($collection) { - $error = Eden_Sql_Error::i()->argument(1, 'string'); - - if(!is_subclass_of($collection, 'Eden_Collection')) { - $error->setMessage(Eden_Sql_Error::NOT_SUB_COLLECTION) - ->addVariable($collection) - ->trigger(); - } - - $this->_collection = $collection; - return $this; - } - - /** - * Group by clause - * - * @param string group - * @return this - * @notes adds broup by functionality - */ - public function setGroup($group) { - //Argument 1 must be a string or array - Eden_Sql_Error::i()->argument(1, 'string', 'array'); - - if(is_string($group)) { - $group = array($group); - } - - $this->_group = $group; - return $this; - } - - /** - * Sets default model - * - * @param string - * @return this - */ - public function setModel($model) { - $error = Eden_Sql_Error::i()->argument(1, 'string'); - - if(!is_subclass_of($model, 'Eden_Model')) { - $error->setMessage(Eden_Sql_Error::NOT_SUB_MODEL) - ->addVariable($model) - ->trigger(); - } - - $this->_model = $model; - return $this; - } - - /** - * Sets the pagination page - * - * @param int - * @return this - */ - public function setPage($page) { - Eden_Sql_Error::i()->argument(1, 'int'); - - if($page < 1) { - $page = 1; - } - - $this->_start = ($page - 1) * $this->_range; - - return $this; - } - - /** - * Sets the pagination range - * - * @param int - * @return this - */ - public function setRange($range) { - Eden_Sql_Error::i()->argument(1, 'int'); - - if($range < 0) { - $range = 25; - } - - $this->_range = $range; - - return $this; - } - - /** - * Sets the pagination start - * - * @param int - * @return this - */ - public function setStart($start) { - Eden_Sql_Error::i()->argument(1, 'int'); - - if($start < 0) { - $start = 0; - } - - $this->_start = $start; - - return $this; - } - - /** - * Sets Table - * - * @param string - * @return this - */ - public function setTable($table) { - Eden_Sql_Error::i()->argument(1, 'string'); - $this->_table = $table; - return $this; - } - - /* Protected Methods - -------------------------------*/ - protected function _getQuery() { - $query = $this->_database->select()->from($this->_table); - - foreach($this->_join as $join) { - if(!is_array($join[2])) { - $join[2] = array($join[2]); - } - - $where = array_shift($join[2]); - if(!empty($join[2])) { - foreach($join[2] as $i => $value) { - $join[2][$i] = $this->_database->bind($value); - } - - $where = vsprintf($where, $join[2]); - } - - $query->join($join[0], $join[1], $where, $join[3]); - } - - - foreach($this->_filter as $i => $filter) { - //array('post_id=%s AND post_title IN %s', 123, array('asd')); - $where = array_shift($filter); - if(!empty($filter)) { - foreach($filter as $i => $value) { - $filter[$i] = $this->_database->bind($value); - } - - $where = vsprintf($where, $filter); - } - - $query->where($where); - } - - return $query; - } - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Sql Search + * + * @package Eden + * @category sql + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Sql_Search extends Eden_Class { + /* Constants + -------------------------------*/ + const LEFT = 'LEFT'; + const RIGHT = 'RIGHT'; + const INNER = 'INNER'; + const OUTER = 'OUTER'; + const ASC = 'ASC'; + const DESC = 'DESC'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_database = NULL; + protected $_table = NULL; + protected $_columns = array(); + protected $_join = array(); + protected $_filter = array(); + protected $_sort = array(); + protected $_group = array(); + protected $_start = 0; + protected $_range = 0; + + protected $_model = Eden_Sql_Database::MODEL; + protected $_collection = Eden_Sql_Database::COLLECTION; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __call($name, $args) { + if(strpos($name, 'filterBy') === 0) { + //filterByUserName('Chris', '-') + $separator = '_'; + if(isset($args[1]) && is_scalar($args[1])) { + $separator = (string) $args[1]; + } + + $key = Eden_Type_String::i($name) + ->substr(8) + ->preg_replace("/([A-Z0-9])/", $separator."$1") + ->substr(strlen($separator)) + ->strtolower() + ->get(); + + if(!isset($args[0])) { + $args[0] = NULL; + } + + $key = $key.'=%s'; + + $this->addFilter($key, $args[0]); + + return $this; + } + + if(strpos($name, 'sortBy') === 0) { + //filterByUserName('Chris', '-') + $separator = '_'; + if(isset($args[1]) && is_scalar($args[1])) { + $separator = (string) $args[1]; + } + + $key = Eden_Type_String::i($name) + ->substr(6) + ->preg_replace("/([A-Z0-9])/", $separator."$1") + ->substr(strlen($separator)) + ->strtolower() + ->get(); + + if(!isset($args[0])) { + $args[0] = self::ASC; + } + + $this->addSort($key, $args[0]); + + return $this; + } + + try { + return parent::__call($name, $args); + } catch(Eden_Error $e) { + Eden_Sql_Error::i($e->getMessage())->trigger(); + } + } + + public function __construct(Eden_Sql_Database $database) { + $this->_database = $database; + } + + /* Public Methods + -------------------------------*/ + + /** + * Adds filter + * + * @param string + * @param string[,string..] + * @return this + */ + public function addFilter() { + Eden_Sql_Error::i()->argument(1, 'string'); + + $this->_filter[] = func_get_args(); + + return $this; + } + + /** + * Adds Inner Join On + * + * @param string + * @param string[,string..] + * @return this + */ + public function addInnerJoinOn($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::INNER, $table, $where, false); + + return $this; + } + + /** + * Adds Inner Join Using + * + * @param string + * @param string[,string..] + * @return this + */ + public function addInnerJoinUsing($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::INNER, $table, $where, true); + + return $this; + } + + /** + * Adds Left Join On + * + * @param string + * @param string[,string..] + * @return this + */ + public function addLeftJoinOn($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::LEFT, $table, $where, false); + + return $this; + } + + /** + * Adds Left Join Using + * + * @param string + * @param string[,string..] + * @return this + */ + public function addLeftJoinUsing($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::LEFT, $table, $where, true); + + return $this; + } + + /** + * Adds Outer Join On + * + * @param string + * @param string[,string..] + * @return this + */ + public function addOuterJoinOn($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::OUTER, $table, $where, false); + + return $this; + } + + /** + * Adds Outer Join USing + * + * @param string + * @param string[,string..] + * @return this + */ + public function addOuterJoinUsing($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::OUTER, $table, $where, true); + + return $this; + } + + /** + * Adds Right Join On + * + * @param string + * @param string[,string..] + * @return this + */ + public function addRightJoinOn($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::RIGHT, $table, $where, false); + + return $this; + } + + /** + * Adds Right Join Using + * + * @param string + * @param string[,string..] + * @return this + */ + public function addRightJoinUsing($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::RIGHT, $table, $where, true); + + return $this; + } + + /** + * Adds sort + * + * @param string + * @param string + * @return this + */ + public function addSort($column, $order = self::ASC) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + if($order != self::DESC) { + $order = self::ASC; + } + + $this->_sort[$column] = $order; + + return $this; + } + + /** + * Returns the results in a collection + * + * @return Eden_Sql_Collection + */ + public function getCollection() { + $collection = $this->_collection; + return $this->$collection() + ->setDatabase($this->_database) + ->setTable($this->_table) + ->setModel($this->_model) + ->set($this->getRows()); + } + + /** + * Returns the one result in a model + * + * @param int + * @return Eden_Sql_Model + */ + public function getModel($index = 0) { + Eden_Sql_Error::i()->argument(1, 'int'); + return $this->getCollection()->offsetGet($index); + } + + /** + * Returns the one result + * + * @param int|string + * @param string|null + * @return array|null + */ + public function getRow($index = 0, $column = NULL) { + Eden_Sql_Error::i() + ->argument(1, 'int', 'string') + ->argument(2, 'string', 'null'); + + if(is_string($index)) { + $column = $index; + $index = 0; + } + + $rows = $this->getRows(); + + if(!is_null($column) && isset($rows[$index][$column])) { + return $rows[$index][$column]; + } else if(is_null($column) && isset($rows[$index])) { + return $rows[$index]; + } + + return NULL; + } + + /** + * Returns the array rows + * + * @return array + */ + public function getRows() { + $query = $this->_getQuery(); + + if(!empty($this->_columns)) { + $query->select(implode(', ', $this->_columns)); + } + + foreach($this->_sort as $key => $value) { + $query->sortBy($key, $value); + } + + if($this->_range) { + $query->limit($this->_start, $this->_range); + } + + if(!empty($this->_group)) { + $query->groupBy($this->_group); + } + + return $this->_database->query($query, $this->_database->getBinds()); + } + + /** + * Returns the total results + * + * @return int + */ + public function getTotal() { + $query = $this->_getQuery()->select('COUNT(*) as total'); + + $rows = $this->_database->query($query, $this->_database->getBinds()); + + if(!isset($rows[0]['total'])) { + return 0; + } + + return $rows[0]['total']; + } + + /** + * Adds Inner Join On + * + * @param string + * @param string[,string..] + * @return this + */ + public function innerJoinOn($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::INNER, $table, $where, false); + + return $this; + } + + /** + * Adds Inner Join Using + * + * @param string + * @param string[,string..] + * @return this + */ + public function innerJoinUsing($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::INNER, $table, $where, true); + + return $this; + } + + /** + * Adds Left Join On + * + * @param string + * @param string[,string..] + * @return this + */ + public function leftJoinOn($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::LEFT, $table, $where, false); + + return $this; + } + + /** + * Adds Left Join Using + * + * @param string + * @param string[,string..] + * @return this + */ + public function leftJoinUsing($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::LEFT, $table, $where, true); + + return $this; + } + + /** + * Adds Outer Join On + * + * @param string + * @param string[,string..] + * @return this + */ + public function outerJoinOn($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::OUTER, $table, $where, false); + + return $this; + } + + /** + * Adds Outer Join USing + * + * @param string + * @param string[,string..] + * @return this + */ + public function outerJoinUsing($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::OUTER, $table, $where, true); + + return $this; + } + + /** + * Adds Right Join On + * + * @param string + * @param string[,string..] + * @return this + */ + public function rightJoinOn($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::RIGHT, $table, $where, false); + + return $this; + } + + /** + * Adds Right Join Using + * + * @param string + * @param string[,string..] + * @return this + */ + public function rightJoinUsing($table, $where) { + Eden_Sql_Error::i() + ->argument(1, 'string') + ->argument(2, 'string'); + + $where = func_get_args(); + $table = array_shift($where); + + $this->_join[] = array(self::RIGHT, $table, $where, true); + + return $this; + } + + /** + * Sets Columns + * + * @param string[,string..]|array + * @return this + */ + public function setColumns($columns) { + if(!is_array($columns)) { + $columns = func_get_args(); + } + + $this->_columns = $columns; + + return $this; + } + + /** + * Sets default collection + * + * @param string + * @return this + */ + public function setCollection($collection) { + $error = Eden_Sql_Error::i()->argument(1, 'string'); + + if(!is_subclass_of($collection, 'Eden_Collection')) { + $error->setMessage(Eden_Sql_Error::NOT_SUB_COLLECTION) + ->addVariable($collection) + ->trigger(); + } + + $this->_collection = $collection; + return $this; + } + + /** + * Group by clause + * + * @param string group + * @return this + * @notes adds broup by functionality + */ + public function setGroup($group) { + //Argument 1 must be a string or array + Eden_Sql_Error::i()->argument(1, 'string', 'array'); + + if(is_string($group)) { + $group = array($group); + } + + $this->_group = $group; + return $this; + } + + /** + * Sets default model + * + * @param string + * @return this + */ + public function setModel($model) { + $error = Eden_Sql_Error::i()->argument(1, 'string'); + + if(!is_subclass_of($model, 'Eden_Model')) { + $error->setMessage(Eden_Sql_Error::NOT_SUB_MODEL) + ->addVariable($model) + ->trigger(); + } + + $this->_model = $model; + return $this; + } + + /** + * Sets the pagination page + * + * @param int + * @return this + */ + public function setPage($page) { + Eden_Sql_Error::i()->argument(1, 'int'); + + if($page < 1) { + $page = 1; + } + + $this->_start = ($page - 1) * $this->_range; + + return $this; + } + + /** + * Sets the pagination range + * + * @param int + * @return this + */ + public function setRange($range) { + Eden_Sql_Error::i()->argument(1, 'int'); + + if($range < 0) { + $range = 25; + } + + $this->_range = $range; + + return $this; + } + + /** + * Sets the pagination start + * + * @param int + * @return this + */ + public function setStart($start) { + Eden_Sql_Error::i()->argument(1, 'int'); + + if($start < 0) { + $start = 0; + } + + $this->_start = $start; + + return $this; + } + + /** + * Sets Table + * + * @param string + * @return this + */ + public function setTable($table) { + Eden_Sql_Error::i()->argument(1, 'string'); + $this->_table = $table; + return $this; + } + + /* Protected Methods + -------------------------------*/ + protected function _getQuery() { + $query = $this->_database->select()->from($this->_table); + + foreach($this->_join as $join) { + if(!is_array($join[2])) { + $join[2] = array($join[2]); + } + + $where = array_shift($join[2]); + if(!empty($join[2])) { + foreach($join[2] as $i => $value) { + $join[2][$i] = $this->_database->bind($value); + } + + $where = vsprintf($where, $join[2]); + } + + $query->join($join[0], $join[1], $where, $join[3]); + } + + + foreach($this->_filter as $i => $filter) { + //array('post_id=%s AND post_title IN %s', 123, array('asd')); + $where = array_shift($filter); + if(!empty($filter)) { + foreach($filter as $i => $value) { + $filter[$i] = $this->_database->bind($value); + } + + $where = vsprintf($where, $filter); + } + + $query->where($where); + } + + return $query; + } + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/sqlite/error.php b/library/eden/sqlite/error.php index 16e9a41..f47f56f 100644 --- a/library/eden/sqlite/error.php +++ b/library/eden/sqlite/error.php @@ -1,39 +1,39 @@ - -/* - * This file is part of the Eden package. - * (c) 2010-2012 Christian Blanquera - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * MySql Errors - * - * @package Eden - * @category sql - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Sqlite_Error extends Eden_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2010-2012 Christian Blanquera + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * MySql Errors + * + * @package Eden + * @category sql + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Sqlite_Error extends Eden_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/template.php b/library/eden/template.php index 73fb8e8..c6f762d 100755 --- a/library/eden/template.php +++ b/library/eden/template.php @@ -1,129 +1,129 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/class.php'; - -/** - * General available methods for common templating procedures - * - * @package Eden - * @category utility - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Template extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_data = array(); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Sets template variables - * - * @param array|string - * @param mixed - * @return this - */ - public function set($data, $value = NULL) { - Eden_Template_Error::i()->argument(1, 'array', 'string'); - - if(is_array($data)) { - $this->_data = $data; - return $this; - } - - $this->_data[$data] = $value; - - return $this; - } - - /** - * Simple string replace template parser - * - * @param *string template file - * @return string - */ - public function parseString($string) { - Eden_Template_Error::i()->argument(1, 'string'); - foreach($this->_data as $key => $value) { - $string = str_replace($key, $value, $string); - } - - return $string; - } - - /** - * For PHP templates, this will transform the given document to an actual page or partial - * - * @param *string template file or PHP template string - * @param bool whether to evaluate the first argument - * @return string - */ - public function parsePhp($____file, $___evalString = false) { - Eden_Template_Error::i() - ->argument(1, $____file, 'string') - ->argument(2, $___evalString, 'bool'); - - extract($this->_data, EXTR_SKIP); // Extract the values to a local namespace - - if($___evalString) { - return eval('?>'.$___file.' +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/class.php'; + +/** + * General available methods for common templating procedures + * + * @package Eden + * @category utility + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Template extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_data = array(); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Sets template variables + * + * @param array|string + * @param mixed + * @return this + */ + public function set($data, $value = NULL) { + Eden_Template_Error::i()->argument(1, 'array', 'string'); + + if(is_array($data)) { + $this->_data = $data; + return $this; + } + + $this->_data[$data] = $value; + + return $this; + } + + /** + * Simple string replace template parser + * + * @param *string template file + * @return string + */ + public function parseString($string) { + Eden_Template_Error::i()->argument(1, 'string'); + foreach($this->_data as $key => $value) { + $string = str_replace($key, $value, $string); + } + + return $string; + } + + /** + * For PHP templates, this will transform the given document to an actual page or partial + * + * @param *string template file or PHP template string + * @param bool whether to evaluate the first argument + * @return string + */ + public function parsePhp($____file, $___evalString = false) { + Eden_Template_Error::i() + ->argument(1, $____file, 'string') + ->argument(2, $___evalString, 'bool'); + + extract($this->_data, EXTR_SKIP); // Extract the values to a local namespace + + if($___evalString) { + return eval('?>'.$___file.' -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Timezone Errors - * - * @package Eden - * @category utility - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Timezone_Error extends Eden_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - protected function _isValid($type, $data) { - $valid = Eden_Timezone_Validation::i(); - - switch($type) { - case 'location': - return $valid->isLocation($data); - case 'utc': - return $valid->isUtc($data); - case 'abbr': - return $valid->isAbbr($data); - default: break; - } - - return parent::_isValid($type, $data); - } - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Timezone Errors + * + * @package Eden + * @category utility + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Timezone_Error extends Eden_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + protected function _isValid($type, $data) { + $valid = Eden_Timezone_Validation::i(); + + switch($type) { + case 'location': + return $valid->isLocation($data); + case 'utc': + return $valid->isUtc($data); + case 'abbr': + return $valid->isAbbr($data); + default: break; + } + + return parent::_isValid($type, $data); + } + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/tumblr.php b/library/eden/tumblr.php index 5d7f031..bbccd8c 100644 --- a/library/eden/tumblr.php +++ b/library/eden/tumblr.php @@ -1,106 +1,106 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/oauth.php'; -require_once dirname(__FILE__).'/tumblr/error.php'; -require_once dirname(__FILE__).'/tumblr/base.php'; -require_once dirname(__FILE__).'/tumblr/oauth.php'; -require_once dirname(__FILE__).'/tumblr/blog.php'; -require_once dirname(__FILE__).'/tumblr/user.php'; - -/** - * Tumblr API factory. This is a factory class with - * methods that will load up different tumblr classes. - * Tumblr classes are organized as described on their - * developer site: blog and user. - * - * @package Eden - * @category tumblr - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Tumblr extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /** - * Returns tumblr auth method - * - * @param *string - * @param *string - * @return Eden_Tumblr_Oauth - */ - public function auth($key, $secret) { - //Argument test - Eden_Tumblr_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string'); //Argument 2 must be a string - - return Eden_Tumblr_Oauth::i($key, $secret); - } - - /** - * Returns tumblr blog method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Tumblr_Blog - */ - public function blog($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //argument test - Eden_Tumblr_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Tumblr_Blog::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns tumblr blog method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Tumblr_User - */ - public function user($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //argument test - Eden_Tumblr_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Tumblr_User::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/oauth.php'; +require_once dirname(__FILE__).'/tumblr/error.php'; +require_once dirname(__FILE__).'/tumblr/base.php'; +require_once dirname(__FILE__).'/tumblr/oauth.php'; +require_once dirname(__FILE__).'/tumblr/blog.php'; +require_once dirname(__FILE__).'/tumblr/user.php'; + +/** + * Tumblr API factory. This is a factory class with + * methods that will load up different tumblr classes. + * Tumblr classes are organized as described on their + * developer site: blog and user. + * + * @package Eden + * @category tumblr + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Tumblr extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /** + * Returns tumblr auth method + * + * @param *string + * @param *string + * @return Eden_Tumblr_Oauth + */ + public function auth($key, $secret) { + //Argument test + Eden_Tumblr_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string'); //Argument 2 must be a string + + return Eden_Tumblr_Oauth::i($key, $secret); + } + + /** + * Returns tumblr blog method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Tumblr_Blog + */ + public function blog($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //argument test + Eden_Tumblr_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Tumblr_Blog::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns tumblr blog method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Tumblr_User + */ + public function user($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //argument test + Eden_Tumblr_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Tumblr_User::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/tumblr/oauth.php b/library/eden/tumblr/oauth.php index d301bce..ccc4436 100644 --- a/library/eden/tumblr/oauth.php +++ b/library/eden/tumblr/oauth.php @@ -1,121 +1,121 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Tumblr oauth - * - * @package Eden - * @category tumblr - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Tumblr_Oauth extends Eden_Class { - /* Constants - -------------------------------*/ - const REQUEST_URL = 'http://www.tumblr.com/oauth/request_token'; - const AUTHORIZE_URL = 'http://www.tumblr.com/oauth/authorize'; - const ACCESS_URL = 'http://www.tumblr.com/oauth/access_token'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_key = NULL; - protected $_secret = NULL; - - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($key, $secret) { - //argument test - Eden_Tumblr_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string'); //Argument 2 must be a string - - $this->_key = $key; - $this->_secret = $secret; - } - - /* Public Methods - -------------------------------*/ - /** - * Returns the access token - * - * @param string the response key; from the url usually - * @param string the request secret; from getRequestToken() usually - * @return string the response verifier; from the url usually - */ - public function getAccessToken($token, $secret, $verifier) { - //argument test - Eden_Tumblr_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string'); //Argument 3 must be a string - - return Eden_Oauth::i() - ->consumer( - self::ACCESS_URL, - $this->_key, - $this->_secret) - ->useAuthorization() - ->setMethodToPost() - ->setToken($token, $secret) - ->setVerifier($verifier) - ->setSignatureToHmacSha1() - ->getQueryResponse(); - } - - /** - * Returns the URL used for login. - * - * @param string the request key - * @param string - * @return string - */ - public function getLoginUrl($token, $redirect) { - //Argument tests - Eden_Tumblr_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string'); //Argument 2 must be a string - - //build the query - $query = array('oauth_token' => $token, 'oauth_callback' => $redirect); - $query = http_build_query($query); - - return self::AUTHORIZE_URL.'?'.$query; - } - - /** - * Return a request token - * - * @return string - */ - public function getRequestToken() { - return Eden_Oauth::i() - ->consumer( - self::REQUEST_URL, - $this->_key, - $this->_secret) - ->useAuthorization() - ->setMethodToPost() - ->setSignatureToHmacSha1() - ->getQueryResponse(); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Tumblr oauth + * + * @package Eden + * @category tumblr + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Tumblr_Oauth extends Eden_Class { + /* Constants + -------------------------------*/ + const REQUEST_URL = 'http://www.tumblr.com/oauth/request_token'; + const AUTHORIZE_URL = 'http://www.tumblr.com/oauth/authorize'; + const ACCESS_URL = 'http://www.tumblr.com/oauth/access_token'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_key = NULL; + protected $_secret = NULL; + + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($key, $secret) { + //argument test + Eden_Tumblr_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string'); //Argument 2 must be a string + + $this->_key = $key; + $this->_secret = $secret; + } + + /* Public Methods + -------------------------------*/ + /** + * Returns the access token + * + * @param string the response key; from the url usually + * @param string the request secret; from getRequestToken() usually + * @return string the response verifier; from the url usually + */ + public function getAccessToken($token, $secret, $verifier) { + //argument test + Eden_Tumblr_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string'); //Argument 3 must be a string + + return Eden_Oauth::i() + ->consumer( + self::ACCESS_URL, + $this->_key, + $this->_secret) + ->useAuthorization() + ->setMethodToPost() + ->setToken($token, $secret) + ->setVerifier($verifier) + ->setSignatureToHmacSha1() + ->getQueryResponse(); + } + + /** + * Returns the URL used for login. + * + * @param string the request key + * @param string + * @return string + */ + public function getLoginUrl($token, $redirect) { + //Argument tests + Eden_Tumblr_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string'); //Argument 2 must be a string + + //build the query + $query = array('oauth_token' => $token, 'oauth_callback' => $redirect); + $query = http_build_query($query); + + return self::AUTHORIZE_URL.'?'.$query; + } + + /** + * Return a request token + * + * @return string + */ + public function getRequestToken() { + return Eden_Oauth::i() + ->consumer( + self::REQUEST_URL, + $this->_key, + $this->_secret) + ->useAuthorization() + ->setMethodToPost() + ->setSignatureToHmacSha1() + ->getQueryResponse(); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter.php b/library/eden/twitter.php index 7b13fad..89f99c6 100644 --- a/library/eden/twitter.php +++ b/library/eden/twitter.php @@ -1,465 +1,465 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/oauth.php'; -require_once dirname(__FILE__).'/twitter/error.php'; -require_once dirname(__FILE__).'/twitter/base.php'; -require_once dirname(__FILE__).'/twitter/oauth.php'; -require_once dirname(__FILE__).'/twitter/accounts.php'; -require_once dirname(__FILE__).'/twitter/block.php'; -require_once dirname(__FILE__).'/twitter/directmessage.php'; -require_once dirname(__FILE__).'/twitter/favorites.php'; -require_once dirname(__FILE__).'/twitter/friends.php'; -require_once dirname(__FILE__).'/twitter/geo.php'; -require_once dirname(__FILE__).'/twitter/help.php'; -require_once dirname(__FILE__).'/twitter/legal.php'; -require_once dirname(__FILE__).'/twitter/list.php'; -require_once dirname(__FILE__).'/twitter/localtrends.php'; -require_once dirname(__FILE__).'/twitter/notification.php'; -require_once dirname(__FILE__).'/twitter/saved.php'; -require_once dirname(__FILE__).'/twitter/search.php'; -require_once dirname(__FILE__).'/twitter/spam.php'; -require_once dirname(__FILE__).'/twitter/suggestions.php'; -require_once dirname(__FILE__).'/twitter/timeline.php'; -require_once dirname(__FILE__).'/twitter/trends.php'; -require_once dirname(__FILE__).'/twitter/tweets.php'; -require_once dirname(__FILE__).'/twitter/users.php'; - -/** - * Twitter API factory. This is a factory class with - * methods that will load up different twitter classes. - * Twitter classes are organized as described on their - * developer site: account, block, direct message, favorites, friends, geo, - * help, legal, list, local trends, notification, saved searches, search, spam, - * suggestions, timelines, trends, tweets and users. - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Twitter extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /** - * Returns twitter account method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Accounts - */ - public function account($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Accounts::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter oauth method - * - * @param *string - * @param *string - * @return Eden_Twitter_Oauth - */ - public function auth($key, $secret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string'); //Argument 2 must be a string - - return Eden_Twitter_Oauth::i($key, $secret); - } - - /** - * Returns twitter block method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Block - */ - public function block($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Block::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter direct message method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Directmessage - */ - public function directMessage($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Directmessage::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter favorites method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Favorites - */ - public function favorites($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Favorites::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter friends method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Friends - */ - public function friends($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Friends::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter geo method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Geo - */ - public function geo($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Geo::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter help method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Help - */ - public function help($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Help::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter legal method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Legal - */ - public function legal($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Legal::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter list method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_List - */ - public function lists($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_List::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter localTrends method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_LocalTrends - */ - public function localTrends($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_LocalTrends::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter notification method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Notification - */ - public function notification($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Notification::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter saved method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Saved - */ - public function saved($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Saved::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter search method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Search - */ - public function search($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Search::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter spam method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Spam - */ - public function spam($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Spam::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter suggestions method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Suggestions - */ - public function suggestions($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Suggestions::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter timelines method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Timeline - */ - public function timeline($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Timeline::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter trends method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Trends - */ - public function trends($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Trends::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter tweets method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Tweets - */ - public function tweets($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Tweets::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /** - * Returns twitter users method - * - * @param *string - * @param *string - * @param *string - * @param *string - * @return Eden_Twitter_Users - */ - public function users($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //Argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - return Eden_Twitter_Users::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/oauth.php'; +require_once dirname(__FILE__).'/twitter/error.php'; +require_once dirname(__FILE__).'/twitter/base.php'; +require_once dirname(__FILE__).'/twitter/oauth.php'; +require_once dirname(__FILE__).'/twitter/accounts.php'; +require_once dirname(__FILE__).'/twitter/block.php'; +require_once dirname(__FILE__).'/twitter/directmessage.php'; +require_once dirname(__FILE__).'/twitter/favorites.php'; +require_once dirname(__FILE__).'/twitter/friends.php'; +require_once dirname(__FILE__).'/twitter/geo.php'; +require_once dirname(__FILE__).'/twitter/help.php'; +require_once dirname(__FILE__).'/twitter/legal.php'; +require_once dirname(__FILE__).'/twitter/list.php'; +require_once dirname(__FILE__).'/twitter/localtrends.php'; +require_once dirname(__FILE__).'/twitter/notification.php'; +require_once dirname(__FILE__).'/twitter/saved.php'; +require_once dirname(__FILE__).'/twitter/search.php'; +require_once dirname(__FILE__).'/twitter/spam.php'; +require_once dirname(__FILE__).'/twitter/suggestions.php'; +require_once dirname(__FILE__).'/twitter/timeline.php'; +require_once dirname(__FILE__).'/twitter/trends.php'; +require_once dirname(__FILE__).'/twitter/tweets.php'; +require_once dirname(__FILE__).'/twitter/users.php'; + +/** + * Twitter API factory. This is a factory class with + * methods that will load up different twitter classes. + * Twitter classes are organized as described on their + * developer site: account, block, direct message, favorites, friends, geo, + * help, legal, list, local trends, notification, saved searches, search, spam, + * suggestions, timelines, trends, tweets and users. + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Twitter extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /** + * Returns twitter account method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Accounts + */ + public function account($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Accounts::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter oauth method + * + * @param *string + * @param *string + * @return Eden_Twitter_Oauth + */ + public function auth($key, $secret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string'); //Argument 2 must be a string + + return Eden_Twitter_Oauth::i($key, $secret); + } + + /** + * Returns twitter block method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Block + */ + public function block($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Block::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter direct message method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Directmessage + */ + public function directMessage($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Directmessage::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter favorites method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Favorites + */ + public function favorites($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Favorites::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter friends method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Friends + */ + public function friends($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Friends::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter geo method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Geo + */ + public function geo($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Geo::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter help method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Help + */ + public function help($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Help::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter legal method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Legal + */ + public function legal($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Legal::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter list method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_List + */ + public function lists($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_List::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter localTrends method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_LocalTrends + */ + public function localTrends($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_LocalTrends::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter notification method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Notification + */ + public function notification($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Notification::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter saved method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Saved + */ + public function saved($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Saved::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter search method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Search + */ + public function search($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Search::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter spam method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Spam + */ + public function spam($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Spam::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter suggestions method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Suggestions + */ + public function suggestions($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Suggestions::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter timelines method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Timeline + */ + public function timeline($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Timeline::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter trends method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Trends + */ + public function trends($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Trends::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter tweets method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Tweets + */ + public function tweets($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Tweets::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /** + * Returns twitter users method + * + * @param *string + * @param *string + * @param *string + * @param *string + * @return Eden_Twitter_Users + */ + public function users($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //Argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + return Eden_Twitter_Users::i($consumerKey, $consumerSecret, $accessToken, $accessSecret); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/accounts.php b/library/eden/twitter/accounts.php index f1edf3e..959f589 100644 --- a/library/eden/twitter/accounts.php +++ b/library/eden/twitter/accounts.php @@ -1,349 +1,349 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter Account - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Twitter_Accounts extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_LIMIT_STATUS = 'https://api.twitter.com/1/account/rate_limit_status.json'; - const URL_VERIFY_CREDENTIALS = 'https://api.twitter.com/1/account/verify_credentials.json'; - const URL_END_SESSION = 'https://api.twitter.com/1/account/end_session.json'; - const URL_UPDATE_PROFILE = 'https://api.twitter.com/1/account/update_profile.json'; - const URL_UPDATE_BACKGROUND = 'https://api.twitter.com/1/account/update_profile_background_image.json'; - const URL_UPDATE_PROFILE_COLOR = 'https://api.twitter.com/1/account/update_profile_colors.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_entities = NULL; - protected $_status = NULL; - protected $_use = NULL; - protected $_name = NULL; - protected $_url = NULL; - protected $_location = NULL; - protected $_description = NULL; - protected $_image = NULL; - protected $_tile = NULL; - protected $_background = NULL; - protected $_link = NULL; - protected $_border = NULL; - protected $_fill = NULL; - protected $_text = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - - /** - * Returns an HTTP 200 OK response code and - * a representation of the requesting user - * if authentication was successful - * - * @return array - */ - public function getCredentials() { - //populate fields - $query = array( - 'include_entities' => $this->_entities, - 'skip_status' => $this->_status); - - return $this->_getResponse(self::URL_VERIFY_CREDENTIALS, $query); - } - - /** - * Returns the remaining number of API - * requests available to the requesting - * user before the API limit is reached - * for the current hour. - * - * @return array - */ - public function getLimit() { - return $this->_getResponse(self::URL_LIMIT_STATUS); - } - - /** - * Ends the session of the authenticating user, returning a null cookie. - * Use this method to sign users out of client-facing applications like widgets. - * - * @return string - */ - public function logOut() { - return $this->_post(self::URL_END_SESSION); - } - /** - * Set profile background color - * - * @param string - * @return this - */ - public function setBackgroundColor($background) { - //Argument 3 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_background = $background; - return $this; - } - - /** - * Set profile sibebar border color - * - * @param string - * @return this - */ - public function setBorderColor($border) { - //Argument 3 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_border = $border; - return $this; - } - - /** - * Set description - * - * @param string - * @return this - */ - public function setDescriptione($description) { - //Argument 1 must be a string or null - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_description = $description; - return $this; - - } - - /** - * Set include entities - * - * @return this - */ - public function setEntities() { - $this->_entities = true; - return $this; - } - - /** - * Set profile sibebar fill color - * - * @param string - * @return this - */ - public function setFillColor($fill) { - //Argument 3 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_fill = $fill; - return $this; - } - - /** - * Set image - * - * @param string - * @return this - */ - public function setImage($image) { - //Argument 1 must be a string or null - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_image = $image; - return $this; - } - - /** - * Set profile link color - * - * @param string - * @return this - */ - public function setLinkColor($link) { - //Argument 3 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_link = $link; - return $this; - } - - /** - * Set location - * - * @param string - * @return this - */ - public function setLocation($location) { - //Argument 1 must be a string or null - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_location = $location; - return $this; - - } - - /** - * Set name - * - * @param string - * @return this - */ - public function setName($name) { - //Argument 1 must be a string or null - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_name = $name; - return $this; - - } - - /** - * Set skip status - * - * @return this - */ - public function setStatus() { - $this->_status = true; - return $this; - } - - /** - * Set profile text color - * - * @param string - * @return this - */ - public function setTextColor($text) { - //Argument 3 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_text = $text; - return $this; - } - - /** - * Set tile - * - * @param string - * @return this - */ - public function setTile($tile) { - //Argument 1 must be a string or null - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_tile = $tile; - return $this; - } - - /** - * Set url - * - * @param string - * @return this - */ - public function setUrl($url) { - //Argument 1 must be a string or null - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_url = $url; - return $this; - - } - - /** - * Determines whether to display the profile background image or not - * - * @return this - */ - public function show() { - $this->_use = true; - return $this; - } - - /** - * Updates the authenticating user's profile background image. - * This method can also be used to enable or disable the profile - * background image - * - * @return array - */ - public function updateBackground() { - //populate fields - $query = array( - 'include_entities' => $this->_entities, - 'skip_status' => $this->_status, - 'use' => $this->_use, - 'image' => $this->_image, - 'tile' => $this->_tile); - - return $this->_post(self::URL_UPDATE_BACKGROUND, $query); - } - - /** - * Sets values that users are able to - * set under the Account tab of their - * settings page. Only the parameters - * specified will be updated. - * - * @return array - */ - public function updateColor() { - //populate fields - $query = array( - 'include_entities' => $this->_entities, - 'skip_status' => $this->_status, - 'profile_background_color' => $this->_background, - 'profile_link_color' => $this->_link, - 'profile_sidebar_border_color' => $this->_border, - 'profile_sidebar_fill_color' => $this->_fill, - 'profile_text_color' => $this->_text); - - return $this->_post(self::URL_UPDATE_PROFILE_COLOR, $query); - - } - - /** - * Sets values that users are able to set - * under the "Account" tab of their settings - * page. Only the parameters specified - * will be updated. - * - * @return array - */ - public function updateProfile() { - //populate fields - $query = array( - 'include_entities' => $this->_entities, - 'skip_status' => $this->_status, - 'name' => $this->_name, - 'url' => $this->_url, - 'location' => $this->_location, - 'description' => $this->_description); - - return $this->_post(self::URL_UPDATE_PROFILE, $query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter Account + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Twitter_Accounts extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_LIMIT_STATUS = 'https://api.twitter.com/1/account/rate_limit_status.json'; + const URL_VERIFY_CREDENTIALS = 'https://api.twitter.com/1/account/verify_credentials.json'; + const URL_END_SESSION = 'https://api.twitter.com/1/account/end_session.json'; + const URL_UPDATE_PROFILE = 'https://api.twitter.com/1/account/update_profile.json'; + const URL_UPDATE_BACKGROUND = 'https://api.twitter.com/1/account/update_profile_background_image.json'; + const URL_UPDATE_PROFILE_COLOR = 'https://api.twitter.com/1/account/update_profile_colors.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_entities = NULL; + protected $_status = NULL; + protected $_use = NULL; + protected $_name = NULL; + protected $_url = NULL; + protected $_location = NULL; + protected $_description = NULL; + protected $_image = NULL; + protected $_tile = NULL; + protected $_background = NULL; + protected $_link = NULL; + protected $_border = NULL; + protected $_fill = NULL; + protected $_text = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + + /** + * Returns an HTTP 200 OK response code and + * a representation of the requesting user + * if authentication was successful + * + * @return array + */ + public function getCredentials() { + //populate fields + $query = array( + 'include_entities' => $this->_entities, + 'skip_status' => $this->_status); + + return $this->_getResponse(self::URL_VERIFY_CREDENTIALS, $query); + } + + /** + * Returns the remaining number of API + * requests available to the requesting + * user before the API limit is reached + * for the current hour. + * + * @return array + */ + public function getLimit() { + return $this->_getResponse(self::URL_LIMIT_STATUS); + } + + /** + * Ends the session of the authenticating user, returning a null cookie. + * Use this method to sign users out of client-facing applications like widgets. + * + * @return string + */ + public function logOut() { + return $this->_post(self::URL_END_SESSION); + } + /** + * Set profile background color + * + * @param string + * @return this + */ + public function setBackgroundColor($background) { + //Argument 3 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_background = $background; + return $this; + } + + /** + * Set profile sibebar border color + * + * @param string + * @return this + */ + public function setBorderColor($border) { + //Argument 3 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_border = $border; + return $this; + } + + /** + * Set description + * + * @param string + * @return this + */ + public function setDescriptione($description) { + //Argument 1 must be a string or null + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_description = $description; + return $this; + + } + + /** + * Set include entities + * + * @return this + */ + public function setEntities() { + $this->_entities = true; + return $this; + } + + /** + * Set profile sibebar fill color + * + * @param string + * @return this + */ + public function setFillColor($fill) { + //Argument 3 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_fill = $fill; + return $this; + } + + /** + * Set image + * + * @param string + * @return this + */ + public function setImage($image) { + //Argument 1 must be a string or null + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_image = $image; + return $this; + } + + /** + * Set profile link color + * + * @param string + * @return this + */ + public function setLinkColor($link) { + //Argument 3 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_link = $link; + return $this; + } + + /** + * Set location + * + * @param string + * @return this + */ + public function setLocation($location) { + //Argument 1 must be a string or null + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_location = $location; + return $this; + + } + + /** + * Set name + * + * @param string + * @return this + */ + public function setName($name) { + //Argument 1 must be a string or null + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_name = $name; + return $this; + + } + + /** + * Set skip status + * + * @return this + */ + public function setStatus() { + $this->_status = true; + return $this; + } + + /** + * Set profile text color + * + * @param string + * @return this + */ + public function setTextColor($text) { + //Argument 3 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_text = $text; + return $this; + } + + /** + * Set tile + * + * @param string + * @return this + */ + public function setTile($tile) { + //Argument 1 must be a string or null + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_tile = $tile; + return $this; + } + + /** + * Set url + * + * @param string + * @return this + */ + public function setUrl($url) { + //Argument 1 must be a string or null + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_url = $url; + return $this; + + } + + /** + * Determines whether to display the profile background image or not + * + * @return this + */ + public function show() { + $this->_use = true; + return $this; + } + + /** + * Updates the authenticating user's profile background image. + * This method can also be used to enable or disable the profile + * background image + * + * @return array + */ + public function updateBackground() { + //populate fields + $query = array( + 'include_entities' => $this->_entities, + 'skip_status' => $this->_status, + 'use' => $this->_use, + 'image' => $this->_image, + 'tile' => $this->_tile); + + return $this->_post(self::URL_UPDATE_BACKGROUND, $query); + } + + /** + * Sets values that users are able to + * set under the Account tab of their + * settings page. Only the parameters + * specified will be updated. + * + * @return array + */ + public function updateColor() { + //populate fields + $query = array( + 'include_entities' => $this->_entities, + 'skip_status' => $this->_status, + 'profile_background_color' => $this->_background, + 'profile_link_color' => $this->_link, + 'profile_sidebar_border_color' => $this->_border, + 'profile_sidebar_fill_color' => $this->_fill, + 'profile_text_color' => $this->_text); + + return $this->_post(self::URL_UPDATE_PROFILE_COLOR, $query); + + } + + /** + * Sets values that users are able to set + * under the "Account" tab of their settings + * page. Only the parameters specified + * will be updated. + * + * @return array + */ + public function updateProfile() { + //populate fields + $query = array( + 'include_entities' => $this->_entities, + 'skip_status' => $this->_status, + 'name' => $this->_name, + 'url' => $this->_url, + 'location' => $this->_location, + 'description' => $this->_description); + + return $this->_post(self::URL_UPDATE_PROFILE, $query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/base.php b/library/eden/twitter/base.php index 5ed9f5c..c91d6bb 100644 --- a/library/eden/twitter/base.php +++ b/library/eden/twitter/base.php @@ -1,265 +1,265 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter oauth - * - * @package Eden - * @category twitter - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Twitter_Base extends Eden_Oauth_Base { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_consumerKey = NULL; - protected $_consumerSecret = NULL; - protected $_accessToken = NULL; - protected $_accessSecret = NULL; - protected $_signingKey = NULL; - protected $_baseString = NULL; - protected $_signingParams = NULL; - protected $_url = NULL; - protected $_authParams = NULL; - protected $_authHeader = NULL; - protected $_headers = NULL; - - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - /* Magic - -------------------------------*/ - public function __construct($consumerKey, $consumerSecret, $accessToken, $accessSecret) { - //argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'string'); //Argument 4 must be a string - - $this->_consumerKey = $consumerKey; - $this->_consumerSecret = $consumerSecret; - $this->_accessToken = $accessToken; - $this->_accessSecret = $accessSecret; - } - - /* Public Methods - -------------------------------*/ - /** - * Returns the meta of the last call - * - * @return array - */ - public function getMeta($key = NULL) { - Eden_Twitter_Error::i()->argument(1, 'string', 'null'); - - if(isset($this->_meta[$key])) { - return $this->_meta[$key]; - } - - return $this->_meta; - } - - /* Protected Methods - -------------------------------*/ - protected function _accessKey($array) { - foreach($array as $key => $val) { - if(is_array($val)) { - $array[$key] = $this->_accessKey($val); - } - //if value is null - if(is_null($val) || empty($val)) { - unset($array[$key]); - } else if($val === false) { - $array[$key] = 0; - } else if($val === true) { - $array[$key] = 1; - } - - } - - return $array; - } - - protected function _getResponse($url, array $query = array()) { - //prevent sending fields with no value - $query = $this->_accessKey($query); - - $rest = Eden_Oauth::i() - ->consumer($url, $this->_consumerKey, $this->_consumerSecret) - ->setMethodToPost() - ->setToken($this->_accessToken, $this->_accessSecret) - ->setSignatureToHmacSha1(); - - $response = $rest->getJsonResponse($query); - - $this->_meta = $rest->getMeta(); - - return $response; - } - - protected function _post($url, array $query = array()) { - //prevent sending fields with no value - $query = $this->_accessKey($query); - - $rest = Eden_Oauth::i() - ->consumer($url, $this->_consumerKey, $this->_consumerSecret) - ->setMethodToPost() - ->setToken($this->_accessToken, $this->_accessSecret) - ->setSignatureToHmacSha1(); - - //get the authorization parameters as an array - $signature = $rest->getSignature($query); - $authorization = $rest->getAuthorization($signature, false); - $authorization = $this->_buildQuery($authorization); - - if(is_array($query)) { - $query = $this->_buildQuery($query); - } - - $headers = array(); - $headers[] = Eden_Oauth_Consumer::POST_HEADER; - - //determine the conector - $connector = NULL; - - //if there is no question mark - if(strpos($url, '?') === false) { - $connector = '?'; - //if the redirect doesn't end with a question mark - } else if(substr($url, -1) != '?') { - $connector = '&'; - } - - //now add the authorization to the url - $url .= $connector.$authorization; - //set curl - $curl = Eden_Curl::i() - ->verifyHost(false) - ->verifyPeer(false) - ->setUrl($url) - ->setPost(true) - ->setPostFields($query) - ->setHeaders($headers); - - //get the response - $response = $curl->getJsonResponse(); - - $this->_meta = $curl->getMeta(); - $this->_meta['url'] = $url; - $this->_meta['authorization'] = $authorization; - $this->_meta['headers'] = $headers; - $this->_meta['query'] = $query; - - return $response; - } - - protected function _upload($url, array $query = array()) { - //prevent sending fields with no value - $query = $this->_accessKey($query); - //set url - $this->_url = $url; - //make authorization for twitter - $this->_getAuthentication(); - //set headers - $this->_headers['Expect'] = ''; - //at this point, the authentication header si already set - foreach($this->_headers as $k => $v) { - //trim header - $headers[] = trim($k . ': ' . $v); - } - //set curl - $curl = Eden_Curl::i() - ->verifyHost(false) - ->verifyPeer(false) - ->setUrl($url) - ->setPost(true) - ->setPostFields($query) - ->setHeaders($headers); - //json decode the response - $response = $curl->getJsonResponse(); - - $this->_meta = $curl->getMeta(); - $this->_meta['url'] = $url; - $this->_meta['headers'] = $headers; - $this->_meta['query'] = $query; - - return $response; - } - - protected function _getAuthentication() { - //populate fields - $defaults = array( - 'oauth_version' => '1.0', - 'oauth_nonce' => md5(uniqid(rand(), true)), - 'oauth_timestamp' => time(), - 'oauth_consumer_key' => $this->_consumerKey, - 'oauth_signature_method' => 'HMAC-SHA1', - 'oauth_token' => $this->_accessToken); - - //encode the parameters - foreach ($defaults as $k => $v) { - $this->_signingParams[$this->safeEncode($k)] = $this->safeEncode($v); - } - //sort an array by keys using a user-defined comparison function - uksort($this->_signingParams, 'strcmp'); - - foreach ($this->_signingParams as $k => $v) { - //encode key - $k = $this->safeEncode($k); - //encode value - $v = $this->safeEncode($v); - $_signing_params[$k] = $v; - $kv[] = "{$k}={$v}"; - } - //implode signingParams to make it a string - $this->_signingParams = implode('&', $kv); - //check if they have the same value - $this->_authParams = array_intersect_key($defaults, $_signing_params); - //make a base string - $base = array('POST', $this->_url, $this->_signingParams); - //convert array to string and safely encode it - $this->_baseString = implode('&', $this->safeEncode($base)); - //make a signing key by combining consumer secret and access secret - $this->_signingKey = $this->safeEncode($this->_consumerSecret).'&'.$this->safeEncode($this->_accessSecret); - //generate signature - $this->_authParams['oauth_signature'] = $this->safeEncode( - base64_encode(hash_hmac('sha1', $this->_baseString, $this->_signingKey, true))); - - foreach ($this->_authParams as $k => $v) { - $kv[] = "{$k}=\"{$v}\""; - } - //implode authHeader to make it ia string - $this->_authHeader = 'OAuth ' . implode(', ', $kv); - //put it in the authorization headera - $this->_headers['Authorization'] = $this->_authHeader; - } - - protected function safeEncode($data) { - //if data is in array - if (is_array($data)) { - //array map the data - return array_map(array($this, 'safeEncode'), $data); - //else it is not array - } else if (is_scalar($data)) { - //str ireplace data, it is case-insensitive version of str_replace() - return str_ireplace(array('+', '%7E'), array(' ', '~'), rawurlencode($data)); - //else it is null or uempty - } else { - return ''; - } - - } - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter oauth + * + * @package Eden + * @category twitter + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Twitter_Base extends Eden_Oauth_Base { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_consumerKey = NULL; + protected $_consumerSecret = NULL; + protected $_accessToken = NULL; + protected $_accessSecret = NULL; + protected $_signingKey = NULL; + protected $_baseString = NULL; + protected $_signingParams = NULL; + protected $_url = NULL; + protected $_authParams = NULL; + protected $_authHeader = NULL; + protected $_headers = NULL; + + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + /* Magic + -------------------------------*/ + public function __construct($consumerKey, $consumerSecret, $accessToken, $accessSecret) { + //argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'string'); //Argument 4 must be a string + + $this->_consumerKey = $consumerKey; + $this->_consumerSecret = $consumerSecret; + $this->_accessToken = $accessToken; + $this->_accessSecret = $accessSecret; + } + + /* Public Methods + -------------------------------*/ + /** + * Returns the meta of the last call + * + * @return array + */ + public function getMeta($key = NULL) { + Eden_Twitter_Error::i()->argument(1, 'string', 'null'); + + if(isset($this->_meta[$key])) { + return $this->_meta[$key]; + } + + return $this->_meta; + } + + /* Protected Methods + -------------------------------*/ + protected function _accessKey($array) { + foreach($array as $key => $val) { + if(is_array($val)) { + $array[$key] = $this->_accessKey($val); + } + //if value is null + if(is_null($val) || empty($val)) { + unset($array[$key]); + } else if($val === false) { + $array[$key] = 0; + } else if($val === true) { + $array[$key] = 1; + } + + } + + return $array; + } + + protected function _getResponse($url, array $query = array()) { + //prevent sending fields with no value + $query = $this->_accessKey($query); + + $rest = Eden_Oauth::i() + ->consumer($url, $this->_consumerKey, $this->_consumerSecret) + ->setMethodToPost() + ->setToken($this->_accessToken, $this->_accessSecret) + ->setSignatureToHmacSha1(); + + $response = $rest->getJsonResponse($query); + + $this->_meta = $rest->getMeta(); + + return $response; + } + + protected function _post($url, array $query = array()) { + //prevent sending fields with no value + $query = $this->_accessKey($query); + + $rest = Eden_Oauth::i() + ->consumer($url, $this->_consumerKey, $this->_consumerSecret) + ->setMethodToPost() + ->setToken($this->_accessToken, $this->_accessSecret) + ->setSignatureToHmacSha1(); + + //get the authorization parameters as an array + $signature = $rest->getSignature($query); + $authorization = $rest->getAuthorization($signature, false); + $authorization = $this->_buildQuery($authorization); + + if(is_array($query)) { + $query = $this->_buildQuery($query); + } + + $headers = array(); + $headers[] = Eden_Oauth_Consumer::POST_HEADER; + + //determine the conector + $connector = NULL; + + //if there is no question mark + if(strpos($url, '?') === false) { + $connector = '?'; + //if the redirect doesn't end with a question mark + } else if(substr($url, -1) != '?') { + $connector = '&'; + } + + //now add the authorization to the url + $url .= $connector.$authorization; + //set curl + $curl = Eden_Curl::i() + ->verifyHost(false) + ->verifyPeer(false) + ->setUrl($url) + ->setPost(true) + ->setPostFields($query) + ->setHeaders($headers); + + //get the response + $response = $curl->getJsonResponse(); + + $this->_meta = $curl->getMeta(); + $this->_meta['url'] = $url; + $this->_meta['authorization'] = $authorization; + $this->_meta['headers'] = $headers; + $this->_meta['query'] = $query; + + return $response; + } + + protected function _upload($url, array $query = array()) { + //prevent sending fields with no value + $query = $this->_accessKey($query); + //set url + $this->_url = $url; + //make authorization for twitter + $this->_getAuthentication(); + //set headers + $this->_headers['Expect'] = ''; + //at this point, the authentication header si already set + foreach($this->_headers as $k => $v) { + //trim header + $headers[] = trim($k . ': ' . $v); + } + //set curl + $curl = Eden_Curl::i() + ->verifyHost(false) + ->verifyPeer(false) + ->setUrl($url) + ->setPost(true) + ->setPostFields($query) + ->setHeaders($headers); + //json decode the response + $response = $curl->getJsonResponse(); + + $this->_meta = $curl->getMeta(); + $this->_meta['url'] = $url; + $this->_meta['headers'] = $headers; + $this->_meta['query'] = $query; + + return $response; + } + + protected function _getAuthentication() { + //populate fields + $defaults = array( + 'oauth_version' => '1.0', + 'oauth_nonce' => md5(uniqid(rand(), true)), + 'oauth_timestamp' => time(), + 'oauth_consumer_key' => $this->_consumerKey, + 'oauth_signature_method' => 'HMAC-SHA1', + 'oauth_token' => $this->_accessToken); + + //encode the parameters + foreach ($defaults as $k => $v) { + $this->_signingParams[$this->safeEncode($k)] = $this->safeEncode($v); + } + //sort an array by keys using a user-defined comparison function + uksort($this->_signingParams, 'strcmp'); + + foreach ($this->_signingParams as $k => $v) { + //encode key + $k = $this->safeEncode($k); + //encode value + $v = $this->safeEncode($v); + $_signing_params[$k] = $v; + $kv[] = "{$k}={$v}"; + } + //implode signingParams to make it a string + $this->_signingParams = implode('&', $kv); + //check if they have the same value + $this->_authParams = array_intersect_key($defaults, $_signing_params); + //make a base string + $base = array('POST', $this->_url, $this->_signingParams); + //convert array to string and safely encode it + $this->_baseString = implode('&', $this->safeEncode($base)); + //make a signing key by combining consumer secret and access secret + $this->_signingKey = $this->safeEncode($this->_consumerSecret).'&'.$this->safeEncode($this->_accessSecret); + //generate signature + $this->_authParams['oauth_signature'] = $this->safeEncode( + base64_encode(hash_hmac('sha1', $this->_baseString, $this->_signingKey, true))); + + foreach ($this->_authParams as $k => $v) { + $kv[] = "{$k}=\"{$v}\""; + } + //implode authHeader to make it ia string + $this->_authHeader = 'OAuth ' . implode(', ', $kv); + //put it in the authorization headera + $this->_headers['Authorization'] = $this->_authHeader; + } + + protected function safeEncode($data) { + //if data is in array + if (is_array($data)) { + //array map the data + return array_map(array($this, 'safeEncode'), $data); + //else it is not array + } else if (is_scalar($data)) { + //str ireplace data, it is case-insensitive version of str_replace() + return str_ireplace(array('+', '%7E'), array(' ', '~'), rawurlencode($data)); + //else it is null or uempty + } else { + return ''; + } + + } + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/block.php b/library/eden/twitter/block.php index e611d35..3d186a1 100644 --- a/library/eden/twitter/block.php +++ b/library/eden/twitter/block.php @@ -1,222 +1,222 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter block - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Twitter_Block extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_GET_USER_BLOCK = 'https://api.twitter.com/1/blocks/blocking.json'; - const URL_GET_BLOCKING_ID = 'https://api.twitter.com/1/blocks/blocking/ids.json'; - const URL_GET_BLOCKING = 'https://api.twitter.com/1/blocks/exists.json'; - const URL_CREATE_BLOCKING = 'https://api.twitter.com/1/blocks/create.json'; - const URL_REMOVE_BLOCKING = 'https://api.twitter.com/1/blocks/destroy.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Blocks the specified user from following the authenticating user. - * - * @param string|integer either the screen name or user ID - * @param boolean - * @param boolean - * @return array - */ - public function blockUser($id, $entities = false, $status = false) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string, integer - ->argument(2, 'bool') //Argument 2 must be a boolean - ->argument(3, 'bool'); //Argument 3 must be a boolean - - $query = array(); - - //if it is integer - if(is_int($id)) { - //lets put it in our query - $query['user_id'] = $id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $id; - } - - //if entities - if($entities) { - $query['include_entities'] = 1; - } - //if status - if($status) { - $query['skip_status'] = 1; - } - - return $this->_post(self::URL_CREATE_BLOCKING, $query); - } - - /** - * Returns if the authenticating user is blocking a target user. - * - * @param string|integer either the screen name or user ID - * @param boolean - * @param boolean - * @return array - */ - public function isBlocked($id = NULL, $entities = false, $status = false) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string, integer - ->argument(2, 'bool') //Argument 2 must be a boolean - ->argument(3, 'bool'); //Argument 3 must be a boolean - - $query = array(); - - //if it is integer - if(is_int($id)) { - //lets put it in our query - $query['user_id'] = $id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $id; - } - - //if entities - if($entities) { - $query['include_entities'] = 1; - } - //if status - if($status) { - $query['skip_status'] = 1; - } - - return $this->_getResponse(self::URL_GET_BLOCKING, $query); - } - - /** - * Returns an array of numeric user ids - * the authenticating user is blocking. - * - * @param boolean - * @return integer - */ - public function getBlockedUserIds($stringify = false) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'bool'); //Argument 1 must be a boolean - - $query = array('stringify_ids' => $stringify); - - return $this->_getResponse(self::URL_GET_BLOCKING_ID, $query); - } - - /** - * Returns an array of user objects that - * the authenticating user is blocking. - * - * @param integer|null - * @param integer|null - * @param boolean - * @param boolean - * @return array - */ - public function getBlockedUsers($page = NULL, $perPage = NULL, $entities = false, $status = false) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'int', 'null') //Argument 1 must be a integer or null - ->argument(2, 'int', 'null') //Argument 2 must be a integer or null - ->argument(3, 'bool') //Argument 3 must be a boolean - ->argument(4, 'bool'); //Argument 4 must be a boolean - - $query = array(); - - //if it is not empty - if(!is_null($page)) { - //lets put it in query - $query['page'] = $page; - } - //if it is not empty - if(!is_null($perPage)) { - //lets put it in query - $query['per_page'] = $perPage; - } - //if entities - if($entities) { - $query['include_entities'] = 1; - } - //if entities - if($status) { - $query['skip_status'] = 1; - } - - return $this->_getResponse(self::URL_GET_USER_BLOCK, $query); - } - - /** - * Un-blocks the user specified in the ID parameter for the - * authenticating user. - * - * @param string|integer either the screen name or user ID - * @param boolean - * @param boolean - * @return array - */ - public function unblock($id, $entities = false, $status = false) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string, integer - ->argument(2, 'bool') //Argument 2 must be a boolean - ->argument(3, 'bool'); //Argument 3 must be a boolean - - $query = array(); - - //if it is integer - if(is_int($id)) { - //lets put it in our query - $query['user_id'] = $id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $id; - } - - //if entities - if($entities) { - $query['include_entities'] = 1; - } - - //if status - if($status) { - $query['skip_status'] = 1; - } - - return $this->_post(self::URL_REMOVE_BLOCKING, $query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter block + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Twitter_Block extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_GET_USER_BLOCK = 'https://api.twitter.com/1/blocks/blocking.json'; + const URL_GET_BLOCKING_ID = 'https://api.twitter.com/1/blocks/blocking/ids.json'; + const URL_GET_BLOCKING = 'https://api.twitter.com/1/blocks/exists.json'; + const URL_CREATE_BLOCKING = 'https://api.twitter.com/1/blocks/create.json'; + const URL_REMOVE_BLOCKING = 'https://api.twitter.com/1/blocks/destroy.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Blocks the specified user from following the authenticating user. + * + * @param string|integer either the screen name or user ID + * @param boolean + * @param boolean + * @return array + */ + public function blockUser($id, $entities = false, $status = false) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string, integer + ->argument(2, 'bool') //Argument 2 must be a boolean + ->argument(3, 'bool'); //Argument 3 must be a boolean + + $query = array(); + + //if it is integer + if(is_int($id)) { + //lets put it in our query + $query['user_id'] = $id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $id; + } + + //if entities + if($entities) { + $query['include_entities'] = 1; + } + //if status + if($status) { + $query['skip_status'] = 1; + } + + return $this->_post(self::URL_CREATE_BLOCKING, $query); + } + + /** + * Returns if the authenticating user is blocking a target user. + * + * @param string|integer either the screen name or user ID + * @param boolean + * @param boolean + * @return array + */ + public function isBlocked($id = NULL, $entities = false, $status = false) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string, integer + ->argument(2, 'bool') //Argument 2 must be a boolean + ->argument(3, 'bool'); //Argument 3 must be a boolean + + $query = array(); + + //if it is integer + if(is_int($id)) { + //lets put it in our query + $query['user_id'] = $id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $id; + } + + //if entities + if($entities) { + $query['include_entities'] = 1; + } + //if status + if($status) { + $query['skip_status'] = 1; + } + + return $this->_getResponse(self::URL_GET_BLOCKING, $query); + } + + /** + * Returns an array of numeric user ids + * the authenticating user is blocking. + * + * @param boolean + * @return integer + */ + public function getBlockedUserIds($stringify = false) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'bool'); //Argument 1 must be a boolean + + $query = array('stringify_ids' => $stringify); + + return $this->_getResponse(self::URL_GET_BLOCKING_ID, $query); + } + + /** + * Returns an array of user objects that + * the authenticating user is blocking. + * + * @param integer|null + * @param integer|null + * @param boolean + * @param boolean + * @return array + */ + public function getBlockedUsers($page = NULL, $perPage = NULL, $entities = false, $status = false) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'int', 'null') //Argument 1 must be a integer or null + ->argument(2, 'int', 'null') //Argument 2 must be a integer or null + ->argument(3, 'bool') //Argument 3 must be a boolean + ->argument(4, 'bool'); //Argument 4 must be a boolean + + $query = array(); + + //if it is not empty + if(!is_null($page)) { + //lets put it in query + $query['page'] = $page; + } + //if it is not empty + if(!is_null($perPage)) { + //lets put it in query + $query['per_page'] = $perPage; + } + //if entities + if($entities) { + $query['include_entities'] = 1; + } + //if entities + if($status) { + $query['skip_status'] = 1; + } + + return $this->_getResponse(self::URL_GET_USER_BLOCK, $query); + } + + /** + * Un-blocks the user specified in the ID parameter for the + * authenticating user. + * + * @param string|integer either the screen name or user ID + * @param boolean + * @param boolean + * @return array + */ + public function unblock($id, $entities = false, $status = false) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string, integer + ->argument(2, 'bool') //Argument 2 must be a boolean + ->argument(3, 'bool'); //Argument 3 must be a boolean + + $query = array(); + + //if it is integer + if(is_int($id)) { + //lets put it in our query + $query['user_id'] = $id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $id; + } + + //if entities + if($entities) { + $query['include_entities'] = 1; + } + + //if status + if($status) { + $query['skip_status'] = 1; + } + + return $this->_post(self::URL_REMOVE_BLOCKING, $query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/directmessage.php b/library/eden/twitter/directmessage.php index 6ee9cf7..c9ae19d 100644 --- a/library/eden/twitter/directmessage.php +++ b/library/eden/twitter/directmessage.php @@ -1,279 +1,279 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter direct message - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Twitter_Directmessage extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_DIRECT_MESSAGE = 'https://api.twitter.com/1/direct_messages.json'; - const URL_SENT_MESSAGE = 'https://api.twitter.com/1/direct_messages/sent.json'; - const URL_REMOVE_MESSAGE = 'https://api.twitter.com/1/direct_messages/destroy/%d.json'; - const URL_NEW_MESSAGE = 'https://api.twitter.com/1/direct_messages/new.json'; - const URL_SHOW_MESSAGE = 'https://api.twitter.com/1/direct_messages/show/%d.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_entities = false; - protected $_wrap = NULL; - protected $_since = NULL; - protected $_max = 0; - protected $_count = 0; - protected $_page = 0; - protected $_status = false; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns a single direct message, - * specified by an id parameter. - * - * @param int message ID - * @return array - */ - public function getDetail($id) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $url = sprintf(self::URL_SHOW_MESSAGE,$id); - return $this->_getResponse($url); - } - - /** - * Returns the 20 most recent direct messages - * sent to the authenticating user. - * - * @return array - */ - public function getList() { - $query = array(); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_status) { - $query['skip_status'] = 1; - } - - if($this->_since) { - $query['since_id'] = $this->_since; - } - - if($this->_max) { - $query['max_id'] = $this->_max; - } - - if($this->_page) { - $query['page'] = $this->_page; - } - - if($this->_count) { - $query['count'] = $this->_count; - } - - return $this->_getResponse(self::URL_DIRECT_MESSAGE, $query); - } - - /** - * Returns the 20 most recent direct messages - * sent by the authenticating user. - * - * @return array - */ - public function getSent() { - $query = array(); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_since) { - $query['since_id'] = $this->_since; - } - - if($this->_max) { - $query['max_id'] = $this->_max; - } - - if($this->_page) { - $query['page'] = $this->_page; - } - - if($this->_count) { - $query['count'] = $this->_count; - } - - return $this->_getResponse(self::URL_SENT_MESSAGE, $query); - } - - /** - * Each tweet will include a node called "entities". This node offers a variety - * of metadata about the tweet in a discreet structure, including: user_mentions, - * urls, and hashtags. - * - * @return this - */ - public function includeEntities() { - $this->_entities = true; - return $this; - } - - /** - * Destroys the direct message specified in the required - * ID parameter. The authenticating user must be the - * recipient of the specified direct message. - * - * @param int message ID - * @return array - */ - public function remove($id) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $query = array('id' => $id); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - return $this->_post(self::URL_REMOVE_MESSAGE,$query); - } - - /** - * Sends a new direct message to the specified - * user from the authenticating user. - * - * @param string|int user ID or screen name - * @param string - * @return array - */ - public function send($id, $text) { - Eden_Twitter_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string or int - ->argument(2, 'string'); //Argument 2 must be a string - - //poulate fields - $query = array( - 'text' => $text, - 'wrap_links' => $this->_wrap); - - //if it is integer - if(is_int($id)) { - //lets put it in query - $query['user_id'] = $id; - } else { - //lets put it in query - $query['screen_name'] = $id; - } - - return $this->_post(self::URL_NEW_MESSAGE, $query); - } - - /** - * Set count - * - * @param integer|null - * @return this - */ - public function setCount($count) { - //Argument 1 must be an integer or null - Eden_Twitter_Error::i()->argument(1, 'int', 'null'); - - $this->_count = $count; - return $this; - } - - /** - * Set max id - * - * @param integer|null - * @return this - */ - public function setMax($max) { - //Argument 1 must be an integer or null - Eden_Twitter_Error::i()->argument(1, 'int', 'null'); - - $this->_max = $max; - return $this; - } - - /** - * Set page - * - * @param integer|null - * @return this - */ - public function setPage($page) { - //Argument 1 must be an integer or null - Eden_Twitter_Error::i()->argument(1, 'int', 'null'); - - $this->_page = $page; - return $this; - } - - /** - * Set since id - * - * @param integer|null - * @return this - */ - public function setSince($since) { - //Argument 1 must be an integer or null - Eden_Twitter_Error::i()->argument(1, 'int', 'null'); - - $this->_since = $since; - return $this; - } - - /** - * Set wrap link - * - * @param boolean - * @return this - */ - public function setWrap($wrap) { - //Argument 1 must be a boolean - Eden_Twitter_Error::i()->argument(1, 'bool'); - - $this->_wrap = $wrap; - return $this; - } - - /** - * Statuses will not be included in the returned user objects. - * - * @return this - */ - public function skipStatus() { - $this->_status = true; - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter direct message + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Twitter_Directmessage extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_DIRECT_MESSAGE = 'https://api.twitter.com/1/direct_messages.json'; + const URL_SENT_MESSAGE = 'https://api.twitter.com/1/direct_messages/sent.json'; + const URL_REMOVE_MESSAGE = 'https://api.twitter.com/1/direct_messages/destroy/%d.json'; + const URL_NEW_MESSAGE = 'https://api.twitter.com/1/direct_messages/new.json'; + const URL_SHOW_MESSAGE = 'https://api.twitter.com/1/direct_messages/show/%d.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_entities = false; + protected $_wrap = NULL; + protected $_since = NULL; + protected $_max = 0; + protected $_count = 0; + protected $_page = 0; + protected $_status = false; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns a single direct message, + * specified by an id parameter. + * + * @param int message ID + * @return array + */ + public function getDetail($id) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $url = sprintf(self::URL_SHOW_MESSAGE,$id); + return $this->_getResponse($url); + } + + /** + * Returns the 20 most recent direct messages + * sent to the authenticating user. + * + * @return array + */ + public function getList() { + $query = array(); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_status) { + $query['skip_status'] = 1; + } + + if($this->_since) { + $query['since_id'] = $this->_since; + } + + if($this->_max) { + $query['max_id'] = $this->_max; + } + + if($this->_page) { + $query['page'] = $this->_page; + } + + if($this->_count) { + $query['count'] = $this->_count; + } + + return $this->_getResponse(self::URL_DIRECT_MESSAGE, $query); + } + + /** + * Returns the 20 most recent direct messages + * sent by the authenticating user. + * + * @return array + */ + public function getSent() { + $query = array(); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_since) { + $query['since_id'] = $this->_since; + } + + if($this->_max) { + $query['max_id'] = $this->_max; + } + + if($this->_page) { + $query['page'] = $this->_page; + } + + if($this->_count) { + $query['count'] = $this->_count; + } + + return $this->_getResponse(self::URL_SENT_MESSAGE, $query); + } + + /** + * Each tweet will include a node called "entities". This node offers a variety + * of metadata about the tweet in a discreet structure, including: user_mentions, + * urls, and hashtags. + * + * @return this + */ + public function includeEntities() { + $this->_entities = true; + return $this; + } + + /** + * Destroys the direct message specified in the required + * ID parameter. The authenticating user must be the + * recipient of the specified direct message. + * + * @param int message ID + * @return array + */ + public function remove($id) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $query = array('id' => $id); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + return $this->_post(self::URL_REMOVE_MESSAGE,$query); + } + + /** + * Sends a new direct message to the specified + * user from the authenticating user. + * + * @param string|int user ID or screen name + * @param string + * @return array + */ + public function send($id, $text) { + Eden_Twitter_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string or int + ->argument(2, 'string'); //Argument 2 must be a string + + //poulate fields + $query = array( + 'text' => $text, + 'wrap_links' => $this->_wrap); + + //if it is integer + if(is_int($id)) { + //lets put it in query + $query['user_id'] = $id; + } else { + //lets put it in query + $query['screen_name'] = $id; + } + + return $this->_post(self::URL_NEW_MESSAGE, $query); + } + + /** + * Set count + * + * @param integer|null + * @return this + */ + public function setCount($count) { + //Argument 1 must be an integer or null + Eden_Twitter_Error::i()->argument(1, 'int', 'null'); + + $this->_count = $count; + return $this; + } + + /** + * Set max id + * + * @param integer|null + * @return this + */ + public function setMax($max) { + //Argument 1 must be an integer or null + Eden_Twitter_Error::i()->argument(1, 'int', 'null'); + + $this->_max = $max; + return $this; + } + + /** + * Set page + * + * @param integer|null + * @return this + */ + public function setPage($page) { + //Argument 1 must be an integer or null + Eden_Twitter_Error::i()->argument(1, 'int', 'null'); + + $this->_page = $page; + return $this; + } + + /** + * Set since id + * + * @param integer|null + * @return this + */ + public function setSince($since) { + //Argument 1 must be an integer or null + Eden_Twitter_Error::i()->argument(1, 'int', 'null'); + + $this->_since = $since; + return $this; + } + + /** + * Set wrap link + * + * @param boolean + * @return this + */ + public function setWrap($wrap) { + //Argument 1 must be a boolean + Eden_Twitter_Error::i()->argument(1, 'bool'); + + $this->_wrap = $wrap; + return $this; + } + + /** + * Statuses will not be included in the returned user objects. + * + * @return this + */ + public function skipStatus() { + $this->_status = true; + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/favorites.php b/library/eden/twitter/favorites.php index 7b5f8ec..0c9fce4 100644 --- a/library/eden/twitter/favorites.php +++ b/library/eden/twitter/favorites.php @@ -1,130 +1,130 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter favorites - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Twitter_Favorites extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_GET_FAVORITES = 'https://api.twitter.com/1/favorites.json'; - const URL_FAVORITE_STATUS = 'https://api.twitter.com/1/favorites/create/%s.json'; - const URL_UNFAVORITE_STATUS = 'https://api.twitter.com/1/favorites/destroy/%s.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Favorites the status specified in the ID parameter as - * the authenticating user. - * - * @param int the tweet ID - * @param bool - * @return array - */ - public function add($id, $entities = false) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'int') //Argument 1 must be an integer - ->argument(2, 'bool'); //Argument 2 must be a boolean - - $query = array('id' => $id); - - //if entities - if($entities) { - $query['include_entities'] = 1; - } - - $url = sprintf(self::URL_FAVORITE_STATUS, $id); - return $this->_post($url, $query); - } - - /** - * Returns the 20 most recent favorite statuses for the authenticating - * user or user specified by the ID parameter in the requested format. - * - * @param bool - * @param string|int|null - * @param int|null - * @param int|null - * @return array - */ - public function getList($entities = false, $id = NULL, $since = NULL, $page = NULL) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'bool') //Argument 1 must be a boolean - ->argument(2, 'int', 'string', 'null') //Argument 2 must be a string, integer or null - ->argument(3, 'int', 'null') //Argument 3 must be an integer or null - ->argument(4, 'int', 'null'); //Argument 4 must be an integer or null - - $query = array(); - - //if entities - if($entities) { - $query['include_entities'] = 1; - } - - //if it is not empty - if(!is_null($id)) { - //lets put it in our query - $query['id'] = $id; - } - - //if it is not empty - if(!is_null($since)) { - //lets put it in our query - $query['since_id'] = $since; - } - - //if it is not empty - if(!is_null($page)) { - //lets put it in our query - $query['page'] = $page; - } - - return $this->_getResponse(self::URL_GET_FAVORITES, $query); - } - - /** - * Un-favorites the status specified in the ID - * parameter as the authenticating user. - * - * @param int the tweet ID - * @return array - */ - public function remove($id) { - //Argument 1 must be na integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $query = array('id' => $id); - - $url = sprintf(self::URL_UNFAVORITE_STATUS, $id); - return $this->_post($url, $query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter favorites + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Twitter_Favorites extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_GET_FAVORITES = 'https://api.twitter.com/1/favorites.json'; + const URL_FAVORITE_STATUS = 'https://api.twitter.com/1/favorites/create/%s.json'; + const URL_UNFAVORITE_STATUS = 'https://api.twitter.com/1/favorites/destroy/%s.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Favorites the status specified in the ID parameter as + * the authenticating user. + * + * @param int the tweet ID + * @param bool + * @return array + */ + public function add($id, $entities = false) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'int') //Argument 1 must be an integer + ->argument(2, 'bool'); //Argument 2 must be a boolean + + $query = array('id' => $id); + + //if entities + if($entities) { + $query['include_entities'] = 1; + } + + $url = sprintf(self::URL_FAVORITE_STATUS, $id); + return $this->_post($url, $query); + } + + /** + * Returns the 20 most recent favorite statuses for the authenticating + * user or user specified by the ID parameter in the requested format. + * + * @param bool + * @param string|int|null + * @param int|null + * @param int|null + * @return array + */ + public function getList($entities = false, $id = NULL, $since = NULL, $page = NULL) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'bool') //Argument 1 must be a boolean + ->argument(2, 'int', 'string', 'null') //Argument 2 must be a string, integer or null + ->argument(3, 'int', 'null') //Argument 3 must be an integer or null + ->argument(4, 'int', 'null'); //Argument 4 must be an integer or null + + $query = array(); + + //if entities + if($entities) { + $query['include_entities'] = 1; + } + + //if it is not empty + if(!is_null($id)) { + //lets put it in our query + $query['id'] = $id; + } + + //if it is not empty + if(!is_null($since)) { + //lets put it in our query + $query['since_id'] = $since; + } + + //if it is not empty + if(!is_null($page)) { + //lets put it in our query + $query['page'] = $page; + } + + return $this->_getResponse(self::URL_GET_FAVORITES, $query); + } + + /** + * Un-favorites the status specified in the ID + * parameter as the authenticating user. + * + * @param int the tweet ID + * @return array + */ + public function remove($id) { + //Argument 1 must be na integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $query = array('id' => $id); + + $url = sprintf(self::URL_UNFAVORITE_STATUS, $id); + return $this->_post($url, $query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/friends.php b/library/eden/twitter/friends.php index 69c60b8..1b994a2 100644 --- a/library/eden/twitter/friends.php +++ b/library/eden/twitter/friends.php @@ -1,439 +1,439 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter friends and followers - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Twitter_Friends extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_FOLLOWERS = 'https://api.twitter.com/1/followers/ids.json'; - const URL_FRIENDS = 'https://api.twitter.com/1/friends/ids.json'; - const URL_FRIENDS_EXIST = 'https://api.twitter.com/1/friendships/exists.json'; - const URL_INCOMING_FRIENDS = 'https://api.twitter.com/1/friendships/incoming.json'; - const URL_OUTGOING_FRIENDS = 'https://api.twitter.com/1/friendships/outgoing.json'; - const URL_SHOW_FRIENDS = 'https://api.twitter.com/1/friendships/show.json'; - const URL_FOLLOW_FRIENDS = 'https://api.twitter.com/1/friendships/create.json'; - const URL_UNFOLLOW_FRIENDS = 'https://api.twitter.com/1/friendships/destroy.json'; - const URL_LOOKUP_FRIENDS = 'https://api.twitter.com/1/friendships/lookup.json'; - const URL_UPDATE = 'https://api.twitter.com/1/friendships/update.json'; - const URL_NO_RETWEETS_IDS = 'https://api.twitter.com/1/friendships/no_retweet_ids.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Test for the existence of friendship between two users. - * - * @param int|string user ID or screen name - * @param int|string user ID or screen name - * @return bool - */ - public function areFriends($userA, $userB) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be an integer, string - ->argument(2, 'string', 'int'); //Argument 2 must be an integer, string - - $query = array(); - - //if it is integer - if(is_int($userA)) { - //lets put it in query - $query['user_id_a'] = $userA; - //if it is string - } else { - //lets put it in query - $query['screen_name_a'] = $userA; - } - - //if it is integer - if(is_int($userB)) { - //lets put it in query - $query['user_id_b'] = $userB; - //if it is string - } else { - //lets put it in query - $query['screen_name_b'] = $userB; - } - - return $this->_getResponse(self::URL_FRIENDS_EXIST, $query); - } - - /** - * Allows the authenticating users to follow the - * user specified in the ID parameter.. - * - * @param string|int or screen name - * @param bool - * @return array - */ - public function follow($id, $notify = false) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be an integer, string - ->argument(2, 'bool'); //Argument 1 must be a boolean - - $query = array(); - - //if it is integer - if(is_int($id)) { - //lets put it in our query - $query['user_id'] = $id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $id; - } - - return $this->_post(self::URL_FOLLOW_FRIENDS, $query); - } - - /** - * Returns an array of numeric IDs for every - * user following the specified user. - * - * @param bool - * @param int|string|null - * @param int|null - * @return array - */ - public function getFollowers($stringify = false, $id = NULL, $cursor = NULL) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'bool') //Argument 1 must be a boolean - ->argument(2, 'int', 'string', 'null') //Argument 2 must be an integer, string or null - ->argument(3, 'int', 'null'); //Argument 3 must be an integer or null - - $query = array(); - - //if it is not empty - if(!is_null($id)) { - //if it is integer - if(is_int($id)) { - //lets put it in query - $query['user_id'] = $id; - } - - //if it is string - if(is_string($id)) { - //lets put it in query - $query['string_name'] = $id; - } - } - - //if it is not empty - if(!is_null($cursor)) { - //lets put it in query - $query['cursor'] = $cursor; - } - - //if stringify - if($stringify) { - $query['stringify_ids'] = 1; - } - - return $this->_getResponse(self::URL_FOLLOWERS, $query); - } - - /** - * Returns an array of numeric IDs for - * every user the specified user is following. - * - * @param bool - * @param int|string|null user ID or screen name - * @param int|null - * @return array - */ - public function getFollowing($stringify = false, $id = NULL, $cursor = NULL) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'bool') //Argument 1 must be an boolean - ->argument(2, 'int','string', 'null') //Argument 2 must be an integer, string or null - ->argument(3, 'int', 'null'); //Argument 3 must be an integer or null - - $query = array(); - - //if stringify - if($stringify) { - $query['stringify_ids'] = 1; - } - //if it is not empty - if(!is_null($id)) { - //if it is integer - if(is_int($id)) { - //lets put it in query - $query['user_id'] = $id; - //if it is string - } else { - //lets put it in query - $query['screen_name'] = $id; - } - } - //if it is not empty - if(!is_null($cursor)) { - //lets put it in query - $query['cursor'] = $cursor; - } - - return $this->_getResponse(self::URL_FRIENDS, $query); - } - - /** - * Returns an array of numeric IDs for every protected user - * for whom the authenticating user has a pending follow request. - * - * @param boolean - * @param integer|null - * @return array - */ - public function getPendingFollowing($stringify = false, $cursor = NULL) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'boolean') //Argument 1 must be a boolean - ->argument(2, 'int', 'null'); //Argument 2 must be an integer or null - - $query = array(); - - //if stringify - if($stringify) { - $query['stringify_ids'] = 1; - } - - //if it is not empty - if(!is_null($cursor)) { - //lets put it in query - $query['cursor'] = $cursor; - } - - return $this->_getResponse(self::URL_OUTGOING_FRIENDS, $query); - } - - /** - * Returns an array of numeric IDs for every user - * who has a pending request to follow the authenticating user. - * - * @param bool - * @param int|null - * @return array - */ - public function getPendingFollowers($stringify = false, $cursor = NULL) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'boolean') //Argument 1 must be a boolean - ->argument(2, 'int', 'null'); //Argument 2 must be an integer or null - - $query = array(); - - //if stringify - if($stringify) { - $query['stringify_ids'] = 1; - } - - //if it is not empty - if(!is_null($cursor)) { - //lets put it in query - $query['cursor'] = $cursor; - } - - return $this->_getResponse(self::URL_INCOMING_FRIENDS, $query); - } - - /** - * Returns detailed information about the - * relationship between two users. - * - * @param int|string user ID or screen name - * @param int|string user ID or screen name - * @return array - */ - public function getRelationship($id, $target = NULL) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be an integer, string - ->argument(2, 'string', 'int'); //Argument 2 must be an integer, string - - $query = array(); - - //if it is integer - if(is_int($id)) { - //lets put it in query - $query['source_id'] = $id; - //if it is string - } else { - //lets put it in query - $query['source_screen_name'] = $id; - } - - //if it is integer - if(is_int($target)) { - //lets put it in query - $query['target_id'] = $target; - //if it is string - } else { - //lets put it in query - $query['target_screen_name'] = $target; - } - - return $this->_getResponse(self::URL_SHOW_FRIENDS, $query); - } - - /** - * Returns the relationship of the authenticating user to - * the comma separated list - * - * @param int[,int]|string[,string]|array|null list of user IDs or screen names - * @return array - */ - public function getRelationships($id = NULL) { - //Argument 1 must be an integer, string or null - Eden_Twitter_Error::i() ->argument(1, 'int', 'string', 'array', 'null'); - - $query = array(); - - //if it is empty - if(is_null($id)) { - return $this->_getResponse(self::URL_LOOKUP_FRIENDS, $query); - } - - //if it's not an array - if(!is_array($id)) { - //make it into one - $id = func_get_args(); - } - - //if id is integer - if(is_int($id[0])) { - //lets put it in query - $query['user_id'] = implode(',',$id); - //if it is streing - } else { - //lets put it in query - $query['screen_name'] = implode(',',$id); - } - - return $this->_getResponse(self::URL_LOOKUP_FRIENDS, $query); - } - - /** - * Returns an array of user_ids that the - * currently authenticated user does not - * want to see retweets from. - * - * @param bool - * @return array - */ - public function getUsersNoRetweets($stringify = false) { - //Argument 1 must be an boolean - Eden_Twitter_Error::i()->argument(1, 'bool'); - - $query = array(); - - if($stringify) { - //lets put it in query - $query['stringify_ids'] = 1; - } - - return $this->_getResponse(self::URL_NO_RETWEETS_IDS, $query); - } - - /** - * Allows the authenticating users to unfollow - * the user specified in the ID parameter. - * - * @param string|int user ID or screen name - * @param bool - * @return array - */ - public function unfollow($id, $entities = false) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string or int - ->argument(2, 'boolean'); //Argument 2 must be an boolean - - $query = array(); - - //if it is integer - if(is_int($id)) { - //lets put it in query - $query['user_id'] = $id; - } else { - //lets put it in query - $query['string_name'] = $id; - } - - //if entities - if($entities) { - $query['include_entities'] = $entities; - } - - return $this->_post(self::URL_UNFOLLOW_FRIENDS, $query); - } - - /** - * Allows one to enable or disable retweets and device notifications - * from the specified user. - * - * @param string|int user ID or screen name - * @param boolean - * @param boolean - * @return array - */ - public function update($id, $device = false, $retweets = false) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'string', 'int') //Argument 1 must be a string or int - ->argument(2, 'bool') //Argument 2 must be a boolean - ->argument(3, 'bool'); //Argument 3 must be a boolean - - $query = array(); - - //if id is string - if(is_string($id)) { - //lets put it in query - $query['screen_name'] = $id; - //else it is integer - } else { - //lets put it in query - $query['user_id'] = $id; - } - - if($device) { - //lets put it in query - $query['device'] = 1; - } - - if($retweets) { - //lets put it in query - $query['retweets'] = 1; - } - - return $this->_post(self::URL_UPDATE, $query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter friends and followers + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Twitter_Friends extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_FOLLOWERS = 'https://api.twitter.com/1/followers/ids.json'; + const URL_FRIENDS = 'https://api.twitter.com/1/friends/ids.json'; + const URL_FRIENDS_EXIST = 'https://api.twitter.com/1/friendships/exists.json'; + const URL_INCOMING_FRIENDS = 'https://api.twitter.com/1/friendships/incoming.json'; + const URL_OUTGOING_FRIENDS = 'https://api.twitter.com/1/friendships/outgoing.json'; + const URL_SHOW_FRIENDS = 'https://api.twitter.com/1/friendships/show.json'; + const URL_FOLLOW_FRIENDS = 'https://api.twitter.com/1/friendships/create.json'; + const URL_UNFOLLOW_FRIENDS = 'https://api.twitter.com/1/friendships/destroy.json'; + const URL_LOOKUP_FRIENDS = 'https://api.twitter.com/1/friendships/lookup.json'; + const URL_UPDATE = 'https://api.twitter.com/1/friendships/update.json'; + const URL_NO_RETWEETS_IDS = 'https://api.twitter.com/1/friendships/no_retweet_ids.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Test for the existence of friendship between two users. + * + * @param int|string user ID or screen name + * @param int|string user ID or screen name + * @return bool + */ + public function areFriends($userA, $userB) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be an integer, string + ->argument(2, 'string', 'int'); //Argument 2 must be an integer, string + + $query = array(); + + //if it is integer + if(is_int($userA)) { + //lets put it in query + $query['user_id_a'] = $userA; + //if it is string + } else { + //lets put it in query + $query['screen_name_a'] = $userA; + } + + //if it is integer + if(is_int($userB)) { + //lets put it in query + $query['user_id_b'] = $userB; + //if it is string + } else { + //lets put it in query + $query['screen_name_b'] = $userB; + } + + return $this->_getResponse(self::URL_FRIENDS_EXIST, $query); + } + + /** + * Allows the authenticating users to follow the + * user specified in the ID parameter.. + * + * @param string|int or screen name + * @param bool + * @return array + */ + public function follow($id, $notify = false) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be an integer, string + ->argument(2, 'bool'); //Argument 1 must be a boolean + + $query = array(); + + //if it is integer + if(is_int($id)) { + //lets put it in our query + $query['user_id'] = $id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $id; + } + + return $this->_post(self::URL_FOLLOW_FRIENDS, $query); + } + + /** + * Returns an array of numeric IDs for every + * user following the specified user. + * + * @param bool + * @param int|string|null + * @param int|null + * @return array + */ + public function getFollowers($stringify = false, $id = NULL, $cursor = NULL) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'bool') //Argument 1 must be a boolean + ->argument(2, 'int', 'string', 'null') //Argument 2 must be an integer, string or null + ->argument(3, 'int', 'null'); //Argument 3 must be an integer or null + + $query = array(); + + //if it is not empty + if(!is_null($id)) { + //if it is integer + if(is_int($id)) { + //lets put it in query + $query['user_id'] = $id; + } + + //if it is string + if(is_string($id)) { + //lets put it in query + $query['string_name'] = $id; + } + } + + //if it is not empty + if(!is_null($cursor)) { + //lets put it in query + $query['cursor'] = $cursor; + } + + //if stringify + if($stringify) { + $query['stringify_ids'] = 1; + } + + return $this->_getResponse(self::URL_FOLLOWERS, $query); + } + + /** + * Returns an array of numeric IDs for + * every user the specified user is following. + * + * @param bool + * @param int|string|null user ID or screen name + * @param int|null + * @return array + */ + public function getFollowing($stringify = false, $id = NULL, $cursor = NULL) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'bool') //Argument 1 must be an boolean + ->argument(2, 'int','string', 'null') //Argument 2 must be an integer, string or null + ->argument(3, 'int', 'null'); //Argument 3 must be an integer or null + + $query = array(); + + //if stringify + if($stringify) { + $query['stringify_ids'] = 1; + } + //if it is not empty + if(!is_null($id)) { + //if it is integer + if(is_int($id)) { + //lets put it in query + $query['user_id'] = $id; + //if it is string + } else { + //lets put it in query + $query['screen_name'] = $id; + } + } + //if it is not empty + if(!is_null($cursor)) { + //lets put it in query + $query['cursor'] = $cursor; + } + + return $this->_getResponse(self::URL_FRIENDS, $query); + } + + /** + * Returns an array of numeric IDs for every protected user + * for whom the authenticating user has a pending follow request. + * + * @param boolean + * @param integer|null + * @return array + */ + public function getPendingFollowing($stringify = false, $cursor = NULL) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'boolean') //Argument 1 must be a boolean + ->argument(2, 'int', 'null'); //Argument 2 must be an integer or null + + $query = array(); + + //if stringify + if($stringify) { + $query['stringify_ids'] = 1; + } + + //if it is not empty + if(!is_null($cursor)) { + //lets put it in query + $query['cursor'] = $cursor; + } + + return $this->_getResponse(self::URL_OUTGOING_FRIENDS, $query); + } + + /** + * Returns an array of numeric IDs for every user + * who has a pending request to follow the authenticating user. + * + * @param bool + * @param int|null + * @return array + */ + public function getPendingFollowers($stringify = false, $cursor = NULL) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'boolean') //Argument 1 must be a boolean + ->argument(2, 'int', 'null'); //Argument 2 must be an integer or null + + $query = array(); + + //if stringify + if($stringify) { + $query['stringify_ids'] = 1; + } + + //if it is not empty + if(!is_null($cursor)) { + //lets put it in query + $query['cursor'] = $cursor; + } + + return $this->_getResponse(self::URL_INCOMING_FRIENDS, $query); + } + + /** + * Returns detailed information about the + * relationship between two users. + * + * @param int|string user ID or screen name + * @param int|string user ID or screen name + * @return array + */ + public function getRelationship($id, $target = NULL) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be an integer, string + ->argument(2, 'string', 'int'); //Argument 2 must be an integer, string + + $query = array(); + + //if it is integer + if(is_int($id)) { + //lets put it in query + $query['source_id'] = $id; + //if it is string + } else { + //lets put it in query + $query['source_screen_name'] = $id; + } + + //if it is integer + if(is_int($target)) { + //lets put it in query + $query['target_id'] = $target; + //if it is string + } else { + //lets put it in query + $query['target_screen_name'] = $target; + } + + return $this->_getResponse(self::URL_SHOW_FRIENDS, $query); + } + + /** + * Returns the relationship of the authenticating user to + * the comma separated list + * + * @param int[,int]|string[,string]|array|null list of user IDs or screen names + * @return array + */ + public function getRelationships($id = NULL) { + //Argument 1 must be an integer, string or null + Eden_Twitter_Error::i() ->argument(1, 'int', 'string', 'array', 'null'); + + $query = array(); + + //if it is empty + if(is_null($id)) { + return $this->_getResponse(self::URL_LOOKUP_FRIENDS, $query); + } + + //if it's not an array + if(!is_array($id)) { + //make it into one + $id = func_get_args(); + } + + //if id is integer + if(is_int($id[0])) { + //lets put it in query + $query['user_id'] = implode(',',$id); + //if it is streing + } else { + //lets put it in query + $query['screen_name'] = implode(',',$id); + } + + return $this->_getResponse(self::URL_LOOKUP_FRIENDS, $query); + } + + /** + * Returns an array of user_ids that the + * currently authenticated user does not + * want to see retweets from. + * + * @param bool + * @return array + */ + public function getUsersNoRetweets($stringify = false) { + //Argument 1 must be an boolean + Eden_Twitter_Error::i()->argument(1, 'bool'); + + $query = array(); + + if($stringify) { + //lets put it in query + $query['stringify_ids'] = 1; + } + + return $this->_getResponse(self::URL_NO_RETWEETS_IDS, $query); + } + + /** + * Allows the authenticating users to unfollow + * the user specified in the ID parameter. + * + * @param string|int user ID or screen name + * @param bool + * @return array + */ + public function unfollow($id, $entities = false) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string or int + ->argument(2, 'boolean'); //Argument 2 must be an boolean + + $query = array(); + + //if it is integer + if(is_int($id)) { + //lets put it in query + $query['user_id'] = $id; + } else { + //lets put it in query + $query['string_name'] = $id; + } + + //if entities + if($entities) { + $query['include_entities'] = $entities; + } + + return $this->_post(self::URL_UNFOLLOW_FRIENDS, $query); + } + + /** + * Allows one to enable or disable retweets and device notifications + * from the specified user. + * + * @param string|int user ID or screen name + * @param boolean + * @param boolean + * @return array + */ + public function update($id, $device = false, $retweets = false) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'string', 'int') //Argument 1 must be a string or int + ->argument(2, 'bool') //Argument 2 must be a boolean + ->argument(3, 'bool'); //Argument 3 must be a boolean + + $query = array(); + + //if id is string + if(is_string($id)) { + //lets put it in query + $query['screen_name'] = $id; + //else it is integer + } else { + //lets put it in query + $query['user_id'] = $id; + } + + if($device) { + //lets put it in query + $query['device'] = 1; + } + + if($retweets) { + //lets put it in query + $query['retweets'] = 1; + } + + return $this->_post(self::URL_UPDATE, $query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/geo.php b/library/eden/twitter/geo.php index 706c465..71fac6c 100644 --- a/library/eden/twitter/geo.php +++ b/library/eden/twitter/geo.php @@ -1,320 +1,320 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter places and geo - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Twitter_Geo extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_GET_PLACE = 'https://api.twitter.com/1/geo/id/%d.json'; - const URL_GET_GEOCODE = 'https://api.twitter.com/1/geo/reverse_geocode.json'; - const URL_SEARCH = 'https://api.twitter.com/1/geo/search.json'; - const URL_GET_SIMILAR_PLACES = 'https://api.twitter.com/1/geo/similar_places.json'; - const URL_CREATE_PLACE = 'https://api.twitter.com/1/geo/place.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_accuracy = NULL; - protected $_granularity = NULL; - protected $_max = NULL; - protected $_callback = NULL; - protected $_latitude = NULL; - protected $_longtitude = NULL; - protected $_input = NULL; - protected $_ip = NULL; - protected $_contained = NULL; - protected $_address = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Creates a new place object at the given - * latitude and longitude. - * - * @param string - * @param string - * @param string - * @param float - * @param float - * @return array - */ - public function createPlace($name, $contained, $token, $lat, $long) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string') //Argument 3 must be a string - ->argument(4, 'float') //Argument 4 must be a float - ->argument(5, 'float'); //Argument 5 must be a float - - //populate fields - $query = array( - 'name' => $name, - 'contained_within' => $contained, - 'token' => $token, - 'lat' => $lat, - 'long' => $long, - 'attribute:street_address' => $this->_address, - 'callback' => $this->_callback); - - return $this->_post(self::URL_CREATE_PLACE, $query); - } - - /** - * Given a latitude and a longitude, searches - * for up to 20 places that can be used as a - * place_id when updating a status - * - * @param float - * @param float - * @return array - */ - public function getGeocode($lat, $long) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'float') //Argument 1 must be a float - ->argument(2, 'float'); //Argument 2 must be a float - - //populate fields - $query = array( - 'lat' => $lat, - 'long' => $long, - 'accuracy' => $this->_accuracy, - 'granularity' => $this->_granularity, - 'max_results' => $this->_max, - 'callback' => $this->_callback); - - return $this->_getResponse(self::URL_GET_GEOCODE, $query); - } - - /** - * Returns all the information about a known place. - * - * @param int place ID - * @return array - */ - public function getPlace($id) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $query = array('place_id' => $id); - - return $this->_getResponse(self::URL_GET_PLACE, $query); - } - - /** - * Locates places near the given coordinates - * which are similar in name. - * - * @param float - * @param float - * @param string - * @return array - */ - public function getSimilarPlaces($lat, $long, $name) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'float') //Argument 1 must be a float - ->argument(2, 'float') //Argument 2 must be a float - ->argument(3, 'string'); //Argument 3 must be a string - - //populate fields - $query = array( - 'lat' => $lat, - 'long' => $long, - 'name' => $name, - 'contained_within' => $this->_contained, - 'attribute:street_address' => $this->_address, - 'callback' => $this->_callback); - - return $this->_getResponse(self::URL_GET_SIMILAR_PLACES, $query); - } - - /** - * Search for places that can be attached - * to a statuses/update. - * - * @return array - */ - public function search() { - //populate fields - $query = array( - 'lat' => $this->_latitude, - 'long' => $this->_longtitude, - 'query' => $this->_input, - 'accuracy' => $this->_accuracy, - 'granularity' => $this->_granularity, - 'max_results' => $this->_max, - 'contained_within' => $this->_contained, - 'attribute:street_address' => $this->_address, - 'callback' => $this->_callback); - - return $this->_getResponse(self::URL_SEARCH, $query); - } - - /** - * Set accuracy - * - * @param string - * @return this - */ - public function setAccuracy($accuracy) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_accuracy = $accuracy; - return $this; - } - - /** - * Set street address - * - * @param string - * @return this - */ - public function setAddress($address) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_address = $address; - return $this; - } - - /** - * Set callback - * - * @param string - * @return this - */ - public function setCallback($callback) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_callback = $callback; - return $this; - } - - /** - * Set contained within - * - * @param string - * @return this - */ - public function setContained($contained) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_contained = $contained; - return $this; - } - - /** - * Set granularity - * - * @param string - * @return this - */ - public function setGranularity($granularity) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_granularity = $granularity; - return $this; - } - - /** - * Set query - * - * @param string - * @return this - */ - public function setInput($input) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_input = $input; - return $this; - } - - /** - * Set ip address - * - * @param string - * @return this - */ - public function setIp($ip) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_ip = $ip; - return $this; - } - - /** - * Set latitude - * - * @param float - * @return this - */ - public function setLatitude($latitude) { - //Argument 1 must be a float - Eden_Twitter_Error::i()->argument(1, 'float'); - - $this->_latitude = $latitude; - return $this; - } - - /** - * Set longtitude - * - * @param float - * @return this - */ - public function setLongtitude($longtitude) { - //Argument 1 must be a float - Eden_Twitter_Error::i()->argument(1, 'float'); - - $this->_longtitude = $longtitude; - return $this; - } - - /** - * Set max results - * - * @param integer - * @return this - */ - public function setMax($max) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_max = $max; - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter places and geo + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Twitter_Geo extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_GET_PLACE = 'https://api.twitter.com/1/geo/id/%d.json'; + const URL_GET_GEOCODE = 'https://api.twitter.com/1/geo/reverse_geocode.json'; + const URL_SEARCH = 'https://api.twitter.com/1/geo/search.json'; + const URL_GET_SIMILAR_PLACES = 'https://api.twitter.com/1/geo/similar_places.json'; + const URL_CREATE_PLACE = 'https://api.twitter.com/1/geo/place.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_accuracy = NULL; + protected $_granularity = NULL; + protected $_max = NULL; + protected $_callback = NULL; + protected $_latitude = NULL; + protected $_longtitude = NULL; + protected $_input = NULL; + protected $_ip = NULL; + protected $_contained = NULL; + protected $_address = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Creates a new place object at the given + * latitude and longitude. + * + * @param string + * @param string + * @param string + * @param float + * @param float + * @return array + */ + public function createPlace($name, $contained, $token, $lat, $long) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string') //Argument 3 must be a string + ->argument(4, 'float') //Argument 4 must be a float + ->argument(5, 'float'); //Argument 5 must be a float + + //populate fields + $query = array( + 'name' => $name, + 'contained_within' => $contained, + 'token' => $token, + 'lat' => $lat, + 'long' => $long, + 'attribute:street_address' => $this->_address, + 'callback' => $this->_callback); + + return $this->_post(self::URL_CREATE_PLACE, $query); + } + + /** + * Given a latitude and a longitude, searches + * for up to 20 places that can be used as a + * place_id when updating a status + * + * @param float + * @param float + * @return array + */ + public function getGeocode($lat, $long) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'float') //Argument 1 must be a float + ->argument(2, 'float'); //Argument 2 must be a float + + //populate fields + $query = array( + 'lat' => $lat, + 'long' => $long, + 'accuracy' => $this->_accuracy, + 'granularity' => $this->_granularity, + 'max_results' => $this->_max, + 'callback' => $this->_callback); + + return $this->_getResponse(self::URL_GET_GEOCODE, $query); + } + + /** + * Returns all the information about a known place. + * + * @param int place ID + * @return array + */ + public function getPlace($id) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $query = array('place_id' => $id); + + return $this->_getResponse(self::URL_GET_PLACE, $query); + } + + /** + * Locates places near the given coordinates + * which are similar in name. + * + * @param float + * @param float + * @param string + * @return array + */ + public function getSimilarPlaces($lat, $long, $name) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'float') //Argument 1 must be a float + ->argument(2, 'float') //Argument 2 must be a float + ->argument(3, 'string'); //Argument 3 must be a string + + //populate fields + $query = array( + 'lat' => $lat, + 'long' => $long, + 'name' => $name, + 'contained_within' => $this->_contained, + 'attribute:street_address' => $this->_address, + 'callback' => $this->_callback); + + return $this->_getResponse(self::URL_GET_SIMILAR_PLACES, $query); + } + + /** + * Search for places that can be attached + * to a statuses/update. + * + * @return array + */ + public function search() { + //populate fields + $query = array( + 'lat' => $this->_latitude, + 'long' => $this->_longtitude, + 'query' => $this->_input, + 'accuracy' => $this->_accuracy, + 'granularity' => $this->_granularity, + 'max_results' => $this->_max, + 'contained_within' => $this->_contained, + 'attribute:street_address' => $this->_address, + 'callback' => $this->_callback); + + return $this->_getResponse(self::URL_SEARCH, $query); + } + + /** + * Set accuracy + * + * @param string + * @return this + */ + public function setAccuracy($accuracy) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_accuracy = $accuracy; + return $this; + } + + /** + * Set street address + * + * @param string + * @return this + */ + public function setAddress($address) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_address = $address; + return $this; + } + + /** + * Set callback + * + * @param string + * @return this + */ + public function setCallback($callback) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_callback = $callback; + return $this; + } + + /** + * Set contained within + * + * @param string + * @return this + */ + public function setContained($contained) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_contained = $contained; + return $this; + } + + /** + * Set granularity + * + * @param string + * @return this + */ + public function setGranularity($granularity) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_granularity = $granularity; + return $this; + } + + /** + * Set query + * + * @param string + * @return this + */ + public function setInput($input) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_input = $input; + return $this; + } + + /** + * Set ip address + * + * @param string + * @return this + */ + public function setIp($ip) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_ip = $ip; + return $this; + } + + /** + * Set latitude + * + * @param float + * @return this + */ + public function setLatitude($latitude) { + //Argument 1 must be a float + Eden_Twitter_Error::i()->argument(1, 'float'); + + $this->_latitude = $latitude; + return $this; + } + + /** + * Set longtitude + * + * @param float + * @return this + */ + public function setLongtitude($longtitude) { + //Argument 1 must be a float + Eden_Twitter_Error::i()->argument(1, 'float'); + + $this->_longtitude = $longtitude; + return $this; + } + + /** + * Set max results + * + * @param integer + * @return this + */ + public function setMax($max) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_max = $max; + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/list.php b/library/eden/twitter/list.php index 8d4ae58..e06133c 100644 --- a/library/eden/twitter/list.php +++ b/library/eden/twitter/list.php @@ -1,980 +1,980 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter list - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Twitter_List extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_ALL_LIST = 'https://api.twitter.com/1/lists/all.json'; - const URL_GET_STATUS = 'https://api.twitter.com/1/lists/statuses.json'; - const URL_REMOVE = 'https://api.twitter.com/1/lists/destroy.json'; - const URL_MEMBERSHIP = 'https://api.twitter.com/1/lists/memberships.json'; - const URL_SUBSCRIBER = 'https://api.twitter.com/1/lists/subscribers.json'; - const URL_CREATE_SUBCRIBER = 'https://api.twitter.com/1/lists/subscribers/create.json'; - const URL_SHOW_SUBSCRIBER = 'https://api.twitter.com/1/lists/subscribers/show.json'; - const URL_REMOVE_SUBCRIBER = 'https://api.twitter.com/1/lists/subscribers/destroy.json'; - const URL_CREATE_ALL = 'https://api.twitter.com/1/lists/members/create_all.json'; - const URL_GET_MEMBER = 'https://api.twitter.com/1/lists/members/show.json'; - const URL_GET_DETAIL = 'https://api.twitter.com/1/lists/members.json'; - const URL_CREATE_MEMBER = 'https://api.twitter.com/1/lists/members/create.json'; - const URL_REMOVE_MEMBER = 'https://api.twitter.com/1/lists/members/destroy'; - const URL_UPDATE = 'https://api.twitter.com/lists/update.json'; - const URL_CREATE_USER = 'https://api.twitter.com/1/lists/create.json'; - const URL_GET_LISTS = 'https://api.twitter.com/1/lists.json'; - const URL_SHOW = 'https://api.twitter.com/1/lists/show.json'; - const URL_GET_SUBSCRITION = 'https://api.twitter.com/1/lists/subscriptions.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_since = NULL; - protected $_max = 0; - protected $_perpage = 0; - protected $_cursor = -1; - protected $_entities = false; - protected $_rts = false; - protected $_filter = false; - protected $_status = false; - protected $_count = 0; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Add a member to a list. The authenticated user - * must own the list to be able to add members - * to it. Note that lists can't have more than 500 members. - * - * @param int|string user ID or screen name - * @param int|string list ID or slug - * @param int|string|null owner ID or screen name - * @return array - */ - public function addMember($userId, $listId, $ownerId = NULL) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'int', 'string') //Argument 2 must be an integer or string - ->argument(3, 'int', 'string', 'null'); //Argument 3 must be an integer, null or string - - $query = array(); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - if(!is_null($ownerId)) { - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - } - - //if it is integer - if(is_int($user_id)) { - //lets put it in our query - $query['user_id'] = $user_id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $user_id; - } - - return $this->_post(self::URL_CREATE_MEMBER, $query); - } - - /** - * Adds multiple members to a list, by specifying a - * comma-separated list of member ids or screen names. - * - * @param int|string list ID or slug - * @param array list of user IDs - * @param int|string ownder ID or screen name - * @return array - */ - public function addMembers($listId, $userIds, $ownerId = NULL) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'array') //Argument 2 must be an array - ->argument(3, 'int', 'string'); //Argument 3 must be an integer or string - - $query = array(); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - - //if id is integer - if(is_int($userIds[0])) { - //lets put it in query - $query['user_id'] = implode(',',$userIds); - //if it is streing - } else { - //lets put it in query - $query['screen_name'] = implode(',',$userIds); - } - - return $this->_post(self::URL_CREATE_ALL, $query); - } - - /** - * Creates a new list for the authenticated user. - * Note that you can't create more than 20 lists per account. - * - * @param string - * @param string|null - * @param bool - * @return array - */ - public function createList($name, $description = NULL, $public = true) { - Eden_Twitter_Error::i() - ->argument(1, 'string') - ->argument(2, 'string', 'null') - ->argument(3, 'bool'); - - $query = array('name' => $name); - - if($description) { - $query['description'] = $description; - } - - if(!$public) { - $query['mode'] = 'private'; - } - - return $this->_post(self::URL_CREATE_USER, $query); - } - - /** - * Returns the members of the specified list. - * Private list members will only be shown if - * the authenticated user owns the specified list. - * - * @param int|string list ID or slug - * @param int|string|null owner ID or screen name - * @return array - */ - public function getMembers($listId, $ownerId = NULL) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string - - $query = array(); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - if(!is_null($ownerId)) { - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - } - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_status) { - $query['skip_status'] = 1; - } - - if($this->_cursor != -1) { - $query['cursor'] = $this->_cursor; - } - - return $this->_getResponse(self::URL_GET_DETAIL, $query); - } - - /** - * Returns all lists the authenticating or specified user - * subscribes to, including their own. - * - * @return array - */ - public function getAllLists() { - //populate fields - $query = array( - 'user_id' => $this->_id, - 'screen_name' => $this->_name); - - return $this->_getResponse(self::URL_ALL_LIST, $query); - } - - /** - * Returns the lists of the specified (or authenticated) - * user. Private lists will be included if the - * authenticated user is the same as the user whose - * lists are being returned. - * - * @param int - * @param string - * @return array - */ - public function getLists($id, $name) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'int') //Argument 1 must be an integer - ->argument(2, 'string'); //Argument 2 must be a string - - //populate fields - $query = array( - 'user_id' => $id, - 'screen_name' => $name); - - if($this->_cursor != -1) { - $query['cursor'] = $this->_cursor; - } - - return $this->_getResponse(self::URL_GET_LISTS, $query); - } - - /** - * Returns the specified list. Private lists will only - * be shown if the authenticated user owns the specified list. - * - * @param int|string list ID or slug - * @param int|string|null owner ID or screen name - * @return array - */ - public function getList($listId, $ownerId = NULL) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string - - $query = array(); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - if(!is_null($ownerId)) { - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - } - - return $this->_getResponse(self::URL_SHOW, $query); - } - - /** - * Returns the lists the specified user has been - * added to. If user_id or screen_name are not - * provided the memberships for the authenticating - * user are returned. - * - * @param int|string|null user ID or screen name - * @return array - */ - public function getMemberships($id = NULL) { - //Argument 1 must be an integer, null or string - Eden_Twitter_Error::i()->argument(1, 'int', 'string', 'null'); - - $query = array(); - - if(!is_null($id)) { - //if it is integer - if(is_int($id)) { - //lets put it in our query - $query['user_id'] = $id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $id; - } - } - - if($this->_cursor != -1) { - $query['cursor'] = $this->_cursor; - } - - if($this->_filter) { - $query['filter_to_owned_lists'] = 1; - } - - return $this->_getResponse(self::URL_MEMBERSHIP, $query); - } - - /** - * Returns tweet timeline for members - * of the specified list. - * - * @param int|string list ID or slug - * @param int|string|null owner ID or screen name - * @return array - */ - public function getTweets($listId, $ownerId = NULL) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string - - $query = array(); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - if(!is_null($ownerId)) { - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - } - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_rts) { - $query['include_rts'] = 1; - } - - if($this->_since) { - $query['since_id'] = $this->_since; - } - - if($this->_max) { - $query['max_id'] = $this->_max; - } - - if($this->_perpage) { - $query['per_page'] = $this->_perpage; - } - - return $this->_getResponse(self::URL_GET_STATUS, $query); - } - - /** - * Returns the subscribers of the specified list. Private list - * subscribers will only be shown if the authenticated user owns - * the specified list. - * - * @param int|string list ID or slug - * @param int|string|null owner ID or screen name - * @return array - */ - public function getSubscribers($listId, $ownerId = NULL) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string - - $query = array(); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - if(!is_null($ownerId)) { - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - } - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_status) { - $query['skip_status'] = 1; - } - - if($this->_cursor != -1) { - $query['cursor'] = $this->_cursor; - } - - return $this->_getResponse(self::URL_SUBSCRIBER,$query); - } - - /** - * Obtain a collection of the lists the specified user is subscribed to, - * 20 lists per page by default. Does not include the user's own lists. - * - * @param int|string user ID or screen name - * @return array - */ - public function getSubscriptions($id) { - //Argument 1 must be an integer or string - Eden_Twitter_Error::i()->argument(1, 'int', 'string'); - - $query = array(); - - //if it is integer - if(is_int($id)) { - //lets put it in our query - $query['user_id'] = $id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $id; - } - - if($this->_cursor != -1) { - $query['cursor'] = $this->_cursor; - } - - if($this->_count) { - $query['count'] = $this->_count; - } - - return $this->_getResponse(self::URL_GET_SUBSCRITION, $query); - } - - /** - * Will return just lists the authenticating user owns, and the user - * represented by user_id or screen_name is a member of. - * - * @return this - */ - public function filterToOwn() { - $this->_filter = true; - return $this; - } - - /** - * Each tweet will include a node called "entities". This node offers a variety - * of metadata about the tweet in a discreet structure, including: user_mentions, - * urls, and hashtags. - * - * @return this - */ - public function includeEntities() { - $this->_entities = true; - return $this; - } - - /** - * The list timeline will contain native retweets (if they exist) in addition to the - * standard stream of tweets. The output format of retweeted tweets is identical to - * the representation you see in home_timeline. - * - * @return this - */ - public function includeRts() { - $this->_rts = true; - return $this; - } - - /** - * Check if the specified user is a member of the specified list. - * - * @param int|string user ID or screen name - * @param int|string list ID or slug - * @param int|string|null owner ID or screen name - * @return array - */ - public function isMember($userId, $listId, $ownerId = NULL) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'int', 'string') //Argument 2 must be an integer or string - ->argument(3, 'int', 'string', 'null'); //Argument 3 must be an integer, null or string - - $query = array(); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - if(!is_null($ownerId)) { - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - } - - //if it is integer - if(is_int($user_id)) { - //lets put it in our query - $query['user_id'] = $user_id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $user_id; - } - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_status) { - $query['skip_status'] = 1; - } - - return $this->_getResponse(self::URL_GET_MEMBER, $query); - } - - /** - * Check if the specified user is a subscriber of the specified list. - * Returns the user if they are subscriber. - * - * @param int|string user ID or screen name - * @param int|string list ID or slug - * @param int|string|null owner ID or screen name - * @return array - */ - public function isSubsciber($userId, $listId, $ownerId = NULL) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'int', 'string') //Argument 2 must be an integer or string - ->argument(3, 'int', 'string', 'null'); //Argument 3 must be an integer, null or string - - $query = array(); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - if(!is_null($ownerId)) { - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - } - - //if it is integer - if(is_int($user_id)) { - //lets put it in our query - $query['user_id'] = $user_id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $user_id; - } - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_status) { - $query['skip_status'] = 1; - } - - return $this->_getResponse(self::URL_SHOW_SUBSCRIBER, $query); - } - - /** - * Deletes the specified list. The authenticated - * user must own the list to be able to destroy it - * - * @param int|string list ID or slug - * @param int|string|null owner ID or screen name - * @return array - */ - public function remove($listId, $ownerId = NULL) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string - - $query = array(); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - if(!is_null($ownerId)) { - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - } - - return $this->_post(self::URL_REMOVE,$query); - } - - /** - * Removes the specified member from the list. - * The authenticated user must be the list's - * owner to remove members from the list. - * - * @param int|string user ID or screen name - * @param int|string list ID or slug - * @param int|string|null owner ID or screen name - * @return array - */ - public function removeMember($userId, $listId, $ownerId = NULL) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'int', 'string') //Argument 2 must be an integer or string - ->argument(3, 'int', 'string', 'null'); //Argument 3 must be an integer, null or string - - $query = array(); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - if(!is_null($ownerId)) { - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - } - - //if it is integer - if(is_int($user_id)) { - //lets put it in our query - $query['user_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $ownerId; - } - - return $this->_post(self::URL_REMOVE_MEMBER, $query); - } - - /** - * Sets count - * - * @param integer - * @return this - */ - public function setCount($count) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_count = $count; - return $this; - } - - /** - * Causes the list of connections to be broken into pages of no more than 5000 - * IDs at a time. The number of IDs returned is not guaranteed to be 5000 as - * suspended users are filtered out after connections are queried. - * - * @param string - * @return this - */ - public function setCursor($cursor) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_cursor = $cursor; - return $this; - } - - /** - * Set max id - * - * @param integer - * @return this - */ - public function setMax($max) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_max = $max; - return $this; - } - - /** - * Sets page - * - * @param integer - * @return this - */ - public function setPage($perpage) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_perpage = $perpage; - return $this; - } - - /** - * Set since id - * - * @param integer the tweet ID - * @return array - */ - public function setSince($since) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_since = $since; - return $this; - } - - /** - * Statuses will not be included in the returned user objects. - * - * @return this - */ - public function skipStatus() { - $this->_status = true; - return $this; - } - - /** - * Subscribes the authenticated - * user to the specified list. - * - * @param int|string list ID or slug - * @param int|string|null owner ID or screen name - * @return array - */ - public function subscribe($listId, $ownerId = NULL) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string - - $query = array(); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - if(!is_null($ownerId)) { - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - } - - return $this->_post(self::URL_CREATE_SUBCRIBER, $query); - } - - /** - * Unsubscribes the authenticated - * user from the specified list. - * - * @param int|string list ID or slug - * @param int|string|null owner ID or screen name - * @return array - */ - public function unsubscribe($listId, $ownerId = NULL) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string - - $query = array(); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - if(!is_null($ownerId)) { - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - } - - return $this->_post(self::URL_REMOVE_SUBCRIBER, $query); - } - - /** - * Updates the specified list. The authenticated user must own - * the list to be able to update it. - * - * @param int|string list ID or slug - * @param string - * @param string - * @param int|string|null owner ID or screen name - * @param bool - * @return array - */ - public function update($listId, $name, $description, $ownerId = NULL, $public = true) { - Eden_Twitter_Error::i() - ->argument(1, 'int', 'string') //Argument 1 must be an integer or string - ->argument(2, 'string') //Argument 2 must be an string - ->argument(3, 'string') //Argument 3 must be an string - ->argument(4, 'int', 'string', 'null') //Argument 4 must be an integer, string or null - ->argument(5, 'bool'); //Argument 3 must be an boolean - $query = array( - 'name' => $name, - 'description' => $description); - - //if it is integer - if(is_int($listId)) { - //lets put it in our query - $query['list_id'] = $listId; - //else it is string - } else { - //lets put it in our query - $query['slug'] = $listId; - } - - if(!is_null($ownerId)) { - //if it is integer - if(is_int($ownerId)) { - //lets put it in our query - $query['owner_id'] = $ownerId; - //else it is string - } else { - //lets put it in our query - $query['owner_screen_name'] = $ownerId; - } - } - - if(!$public) { - $query['mode'] = 'private'; - } - - return $this->_post(self::URL_UPDATE, $query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter list + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Twitter_List extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_ALL_LIST = 'https://api.twitter.com/1/lists/all.json'; + const URL_GET_STATUS = 'https://api.twitter.com/1/lists/statuses.json'; + const URL_REMOVE = 'https://api.twitter.com/1/lists/destroy.json'; + const URL_MEMBERSHIP = 'https://api.twitter.com/1/lists/memberships.json'; + const URL_SUBSCRIBER = 'https://api.twitter.com/1/lists/subscribers.json'; + const URL_CREATE_SUBCRIBER = 'https://api.twitter.com/1/lists/subscribers/create.json'; + const URL_SHOW_SUBSCRIBER = 'https://api.twitter.com/1/lists/subscribers/show.json'; + const URL_REMOVE_SUBCRIBER = 'https://api.twitter.com/1/lists/subscribers/destroy.json'; + const URL_CREATE_ALL = 'https://api.twitter.com/1/lists/members/create_all.json'; + const URL_GET_MEMBER = 'https://api.twitter.com/1/lists/members/show.json'; + const URL_GET_DETAIL = 'https://api.twitter.com/1/lists/members.json'; + const URL_CREATE_MEMBER = 'https://api.twitter.com/1/lists/members/create.json'; + const URL_REMOVE_MEMBER = 'https://api.twitter.com/1/lists/members/destroy'; + const URL_UPDATE = 'https://api.twitter.com/lists/update.json'; + const URL_CREATE_USER = 'https://api.twitter.com/1/lists/create.json'; + const URL_GET_LISTS = 'https://api.twitter.com/1/lists.json'; + const URL_SHOW = 'https://api.twitter.com/1/lists/show.json'; + const URL_GET_SUBSCRITION = 'https://api.twitter.com/1/lists/subscriptions.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_since = NULL; + protected $_max = 0; + protected $_perpage = 0; + protected $_cursor = -1; + protected $_entities = false; + protected $_rts = false; + protected $_filter = false; + protected $_status = false; + protected $_count = 0; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Add a member to a list. The authenticated user + * must own the list to be able to add members + * to it. Note that lists can't have more than 500 members. + * + * @param int|string user ID or screen name + * @param int|string list ID or slug + * @param int|string|null owner ID or screen name + * @return array + */ + public function addMember($userId, $listId, $ownerId = NULL) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'int', 'string') //Argument 2 must be an integer or string + ->argument(3, 'int', 'string', 'null'); //Argument 3 must be an integer, null or string + + $query = array(); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + if(!is_null($ownerId)) { + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + } + + //if it is integer + if(is_int($user_id)) { + //lets put it in our query + $query['user_id'] = $user_id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $user_id; + } + + return $this->_post(self::URL_CREATE_MEMBER, $query); + } + + /** + * Adds multiple members to a list, by specifying a + * comma-separated list of member ids or screen names. + * + * @param int|string list ID or slug + * @param array list of user IDs + * @param int|string ownder ID or screen name + * @return array + */ + public function addMembers($listId, $userIds, $ownerId = NULL) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'array') //Argument 2 must be an array + ->argument(3, 'int', 'string'); //Argument 3 must be an integer or string + + $query = array(); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + + //if id is integer + if(is_int($userIds[0])) { + //lets put it in query + $query['user_id'] = implode(',',$userIds); + //if it is streing + } else { + //lets put it in query + $query['screen_name'] = implode(',',$userIds); + } + + return $this->_post(self::URL_CREATE_ALL, $query); + } + + /** + * Creates a new list for the authenticated user. + * Note that you can't create more than 20 lists per account. + * + * @param string + * @param string|null + * @param bool + * @return array + */ + public function createList($name, $description = NULL, $public = true) { + Eden_Twitter_Error::i() + ->argument(1, 'string') + ->argument(2, 'string', 'null') + ->argument(3, 'bool'); + + $query = array('name' => $name); + + if($description) { + $query['description'] = $description; + } + + if(!$public) { + $query['mode'] = 'private'; + } + + return $this->_post(self::URL_CREATE_USER, $query); + } + + /** + * Returns the members of the specified list. + * Private list members will only be shown if + * the authenticated user owns the specified list. + * + * @param int|string list ID or slug + * @param int|string|null owner ID or screen name + * @return array + */ + public function getMembers($listId, $ownerId = NULL) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string + + $query = array(); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + if(!is_null($ownerId)) { + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + } + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_status) { + $query['skip_status'] = 1; + } + + if($this->_cursor != -1) { + $query['cursor'] = $this->_cursor; + } + + return $this->_getResponse(self::URL_GET_DETAIL, $query); + } + + /** + * Returns all lists the authenticating or specified user + * subscribes to, including their own. + * + * @return array + */ + public function getAllLists() { + //populate fields + $query = array( + 'user_id' => $this->_id, + 'screen_name' => $this->_name); + + return $this->_getResponse(self::URL_ALL_LIST, $query); + } + + /** + * Returns the lists of the specified (or authenticated) + * user. Private lists will be included if the + * authenticated user is the same as the user whose + * lists are being returned. + * + * @param int + * @param string + * @return array + */ + public function getLists($id, $name) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'int') //Argument 1 must be an integer + ->argument(2, 'string'); //Argument 2 must be a string + + //populate fields + $query = array( + 'user_id' => $id, + 'screen_name' => $name); + + if($this->_cursor != -1) { + $query['cursor'] = $this->_cursor; + } + + return $this->_getResponse(self::URL_GET_LISTS, $query); + } + + /** + * Returns the specified list. Private lists will only + * be shown if the authenticated user owns the specified list. + * + * @param int|string list ID or slug + * @param int|string|null owner ID or screen name + * @return array + */ + public function getList($listId, $ownerId = NULL) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string + + $query = array(); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + if(!is_null($ownerId)) { + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + } + + return $this->_getResponse(self::URL_SHOW, $query); + } + + /** + * Returns the lists the specified user has been + * added to. If user_id or screen_name are not + * provided the memberships for the authenticating + * user are returned. + * + * @param int|string|null user ID or screen name + * @return array + */ + public function getMemberships($id = NULL) { + //Argument 1 must be an integer, null or string + Eden_Twitter_Error::i()->argument(1, 'int', 'string', 'null'); + + $query = array(); + + if(!is_null($id)) { + //if it is integer + if(is_int($id)) { + //lets put it in our query + $query['user_id'] = $id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $id; + } + } + + if($this->_cursor != -1) { + $query['cursor'] = $this->_cursor; + } + + if($this->_filter) { + $query['filter_to_owned_lists'] = 1; + } + + return $this->_getResponse(self::URL_MEMBERSHIP, $query); + } + + /** + * Returns tweet timeline for members + * of the specified list. + * + * @param int|string list ID or slug + * @param int|string|null owner ID or screen name + * @return array + */ + public function getTweets($listId, $ownerId = NULL) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string + + $query = array(); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + if(!is_null($ownerId)) { + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + } + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_rts) { + $query['include_rts'] = 1; + } + + if($this->_since) { + $query['since_id'] = $this->_since; + } + + if($this->_max) { + $query['max_id'] = $this->_max; + } + + if($this->_perpage) { + $query['per_page'] = $this->_perpage; + } + + return $this->_getResponse(self::URL_GET_STATUS, $query); + } + + /** + * Returns the subscribers of the specified list. Private list + * subscribers will only be shown if the authenticated user owns + * the specified list. + * + * @param int|string list ID or slug + * @param int|string|null owner ID or screen name + * @return array + */ + public function getSubscribers($listId, $ownerId = NULL) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string + + $query = array(); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + if(!is_null($ownerId)) { + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + } + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_status) { + $query['skip_status'] = 1; + } + + if($this->_cursor != -1) { + $query['cursor'] = $this->_cursor; + } + + return $this->_getResponse(self::URL_SUBSCRIBER,$query); + } + + /** + * Obtain a collection of the lists the specified user is subscribed to, + * 20 lists per page by default. Does not include the user's own lists. + * + * @param int|string user ID or screen name + * @return array + */ + public function getSubscriptions($id) { + //Argument 1 must be an integer or string + Eden_Twitter_Error::i()->argument(1, 'int', 'string'); + + $query = array(); + + //if it is integer + if(is_int($id)) { + //lets put it in our query + $query['user_id'] = $id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $id; + } + + if($this->_cursor != -1) { + $query['cursor'] = $this->_cursor; + } + + if($this->_count) { + $query['count'] = $this->_count; + } + + return $this->_getResponse(self::URL_GET_SUBSCRITION, $query); + } + + /** + * Will return just lists the authenticating user owns, and the user + * represented by user_id or screen_name is a member of. + * + * @return this + */ + public function filterToOwn() { + $this->_filter = true; + return $this; + } + + /** + * Each tweet will include a node called "entities". This node offers a variety + * of metadata about the tweet in a discreet structure, including: user_mentions, + * urls, and hashtags. + * + * @return this + */ + public function includeEntities() { + $this->_entities = true; + return $this; + } + + /** + * The list timeline will contain native retweets (if they exist) in addition to the + * standard stream of tweets. The output format of retweeted tweets is identical to + * the representation you see in home_timeline. + * + * @return this + */ + public function includeRts() { + $this->_rts = true; + return $this; + } + + /** + * Check if the specified user is a member of the specified list. + * + * @param int|string user ID or screen name + * @param int|string list ID or slug + * @param int|string|null owner ID or screen name + * @return array + */ + public function isMember($userId, $listId, $ownerId = NULL) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'int', 'string') //Argument 2 must be an integer or string + ->argument(3, 'int', 'string', 'null'); //Argument 3 must be an integer, null or string + + $query = array(); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + if(!is_null($ownerId)) { + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + } + + //if it is integer + if(is_int($user_id)) { + //lets put it in our query + $query['user_id'] = $user_id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $user_id; + } + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_status) { + $query['skip_status'] = 1; + } + + return $this->_getResponse(self::URL_GET_MEMBER, $query); + } + + /** + * Check if the specified user is a subscriber of the specified list. + * Returns the user if they are subscriber. + * + * @param int|string user ID or screen name + * @param int|string list ID or slug + * @param int|string|null owner ID or screen name + * @return array + */ + public function isSubsciber($userId, $listId, $ownerId = NULL) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'int', 'string') //Argument 2 must be an integer or string + ->argument(3, 'int', 'string', 'null'); //Argument 3 must be an integer, null or string + + $query = array(); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + if(!is_null($ownerId)) { + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + } + + //if it is integer + if(is_int($user_id)) { + //lets put it in our query + $query['user_id'] = $user_id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $user_id; + } + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_status) { + $query['skip_status'] = 1; + } + + return $this->_getResponse(self::URL_SHOW_SUBSCRIBER, $query); + } + + /** + * Deletes the specified list. The authenticated + * user must own the list to be able to destroy it + * + * @param int|string list ID or slug + * @param int|string|null owner ID or screen name + * @return array + */ + public function remove($listId, $ownerId = NULL) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string + + $query = array(); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + if(!is_null($ownerId)) { + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + } + + return $this->_post(self::URL_REMOVE,$query); + } + + /** + * Removes the specified member from the list. + * The authenticated user must be the list's + * owner to remove members from the list. + * + * @param int|string user ID or screen name + * @param int|string list ID or slug + * @param int|string|null owner ID or screen name + * @return array + */ + public function removeMember($userId, $listId, $ownerId = NULL) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'int', 'string') //Argument 2 must be an integer or string + ->argument(3, 'int', 'string', 'null'); //Argument 3 must be an integer, null or string + + $query = array(); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + if(!is_null($ownerId)) { + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + } + + //if it is integer + if(is_int($user_id)) { + //lets put it in our query + $query['user_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $ownerId; + } + + return $this->_post(self::URL_REMOVE_MEMBER, $query); + } + + /** + * Sets count + * + * @param integer + * @return this + */ + public function setCount($count) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_count = $count; + return $this; + } + + /** + * Causes the list of connections to be broken into pages of no more than 5000 + * IDs at a time. The number of IDs returned is not guaranteed to be 5000 as + * suspended users are filtered out after connections are queried. + * + * @param string + * @return this + */ + public function setCursor($cursor) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_cursor = $cursor; + return $this; + } + + /** + * Set max id + * + * @param integer + * @return this + */ + public function setMax($max) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_max = $max; + return $this; + } + + /** + * Sets page + * + * @param integer + * @return this + */ + public function setPage($perpage) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_perpage = $perpage; + return $this; + } + + /** + * Set since id + * + * @param integer the tweet ID + * @return array + */ + public function setSince($since) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_since = $since; + return $this; + } + + /** + * Statuses will not be included in the returned user objects. + * + * @return this + */ + public function skipStatus() { + $this->_status = true; + return $this; + } + + /** + * Subscribes the authenticated + * user to the specified list. + * + * @param int|string list ID or slug + * @param int|string|null owner ID or screen name + * @return array + */ + public function subscribe($listId, $ownerId = NULL) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string + + $query = array(); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + if(!is_null($ownerId)) { + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + } + + return $this->_post(self::URL_CREATE_SUBCRIBER, $query); + } + + /** + * Unsubscribes the authenticated + * user from the specified list. + * + * @param int|string list ID or slug + * @param int|string|null owner ID or screen name + * @return array + */ + public function unsubscribe($listId, $ownerId = NULL) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'int', 'string', 'null'); //Argument 2 must be an integer, null or string + + $query = array(); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + if(!is_null($ownerId)) { + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + } + + return $this->_post(self::URL_REMOVE_SUBCRIBER, $query); + } + + /** + * Updates the specified list. The authenticated user must own + * the list to be able to update it. + * + * @param int|string list ID or slug + * @param string + * @param string + * @param int|string|null owner ID or screen name + * @param bool + * @return array + */ + public function update($listId, $name, $description, $ownerId = NULL, $public = true) { + Eden_Twitter_Error::i() + ->argument(1, 'int', 'string') //Argument 1 must be an integer or string + ->argument(2, 'string') //Argument 2 must be an string + ->argument(3, 'string') //Argument 3 must be an string + ->argument(4, 'int', 'string', 'null') //Argument 4 must be an integer, string or null + ->argument(5, 'bool'); //Argument 3 must be an boolean + $query = array( + 'name' => $name, + 'description' => $description); + + //if it is integer + if(is_int($listId)) { + //lets put it in our query + $query['list_id'] = $listId; + //else it is string + } else { + //lets put it in our query + $query['slug'] = $listId; + } + + if(!is_null($ownerId)) { + //if it is integer + if(is_int($ownerId)) { + //lets put it in our query + $query['owner_id'] = $ownerId; + //else it is string + } else { + //lets put it in our query + $query['owner_screen_name'] = $ownerId; + } + } + + if(!$public) { + $query['mode'] = 'private'; + } + + return $this->_post(self::URL_UPDATE, $query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/notification.php b/library/eden/twitter/notification.php index 0005822..990581d 100644 --- a/library/eden/twitter/notification.php +++ b/library/eden/twitter/notification.php @@ -1,95 +1,95 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter notification - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Twitter_Notification extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_FOLLOW = 'https://api.twitter.com/1/notifications/follow.json'; - const URL_LEAVE = 'https://api.twitter.com/1/notifications/leave.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Enables device notifications for updates - * from the specified user. Returns the - * specified user when successful. - * - * @param string|int user ID or screen name - * @return array - */ - public function follow($id) { - //Argument 1 must be a string or integer - Eden_Twitter_Error::i()->argument(1, 'string', 'int'); - - $query = array(); - - //if it is integer - if(is_int($id)) { - //lets put it in our query - $query['user_id'] = $id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $id; - } - - return $this->_post(self::URL_FOLLOW, $query); - } - - /** - * Disables notifications for updates from the - * specified user to the authenticating user. - * Returns the specified user when successful. - * - * @param string|int user ID or screen name - * @return array - */ - public function leave($id) { - //Argument 1 must be a string or integer - Eden_Twitter_Error::i()->argument(1, 'string', 'int'); - - $query = array(); - - //if it is integer - if(is_int($id)) { - //lets put it in our query - $query['user_id'] = $id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $id; - } - - return $this->_post(self::URL_LEAVE, $query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter notification + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Twitter_Notification extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_FOLLOW = 'https://api.twitter.com/1/notifications/follow.json'; + const URL_LEAVE = 'https://api.twitter.com/1/notifications/leave.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Enables device notifications for updates + * from the specified user. Returns the + * specified user when successful. + * + * @param string|int user ID or screen name + * @return array + */ + public function follow($id) { + //Argument 1 must be a string or integer + Eden_Twitter_Error::i()->argument(1, 'string', 'int'); + + $query = array(); + + //if it is integer + if(is_int($id)) { + //lets put it in our query + $query['user_id'] = $id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $id; + } + + return $this->_post(self::URL_FOLLOW, $query); + } + + /** + * Disables notifications for updates from the + * specified user to the authenticating user. + * Returns the specified user when successful. + * + * @param string|int user ID or screen name + * @return array + */ + public function leave($id) { + //Argument 1 must be a string or integer + Eden_Twitter_Error::i()->argument(1, 'string', 'int'); + + $query = array(); + + //if it is integer + if(is_int($id)) { + //lets put it in our query + $query['user_id'] = $id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $id; + } + + return $this->_post(self::URL_LEAVE, $query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/oauth.php b/library/eden/twitter/oauth.php index 3fa1531..cabf8c7 100644 --- a/library/eden/twitter/oauth.php +++ b/library/eden/twitter/oauth.php @@ -1,123 +1,123 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter oauth - * - * @package Eden - * @category twitter - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Twitter_Oauth extends Eden_Class { - /* Constants - -------------------------------*/ - const REQUEST_URL = 'https://api.twitter.com/oauth/request_token'; - const AUTHORIZE_URL = 'https://api.twitter.com/oauth/authorize'; - const ACCESS_URL = 'https://api.twitter.com/oauth/access_token'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_key = NULL; - protected $_secret = NULL; - - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($key, $secret) { - //argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string'); //Argument 2 must be a string - - $this->_key = $key; - $this->_secret = $secret; - } - - /* Public Methods - -------------------------------*/ - /** - * Returns the access token - * - * @param string the response key; from the url usually - * @param string the request secret; from getRequestToken() usually - * @return string the response verifier; from the url usually - */ - public function getAccessToken($token, $secret, $verifier) { - //argument test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'string'); //Argument 3 must be a string - - return Eden_Oauth::i() - ->consumer( - self::ACCESS_URL, - $this->_key, - $this->_secret) - ->useAuthorization() - ->setMethodToPost() - ->setToken($token, $secret) - ->setVerifier($verifier) - ->setSignatureToHmacSha1() - ->getQueryResponse(); - } - - /** - * Returns the URL used for login. - * - * @param string the request key - * @param string - * @param boolean force user re-login - * @return string - */ - public function getLoginUrl($token, $redirect, $force_login = false) { - //Argument tests - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string') //Argument 2 must be a string - ->argument(3, 'bool'); //Argument 3 must be a boolean - - //build the query - $query = array('oauth_token' => $token, 'oauth_callback' => $redirect, 'force_login' => (int)$force_login); - $query = http_build_query($query); - - return self::AUTHORIZE_URL.'?'.$query; - } - - /** - * Return a request token - * - * @return string - */ - public function getRequestToken() { - return Eden_Oauth::i() - ->consumer( - self::REQUEST_URL, - $this->_key, - $this->_secret) - ->useAuthorization() - ->setMethodToPost() - ->setSignatureToHmacSha1() - ->getQueryResponse(); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter oauth + * + * @package Eden + * @category twitter + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Twitter_Oauth extends Eden_Class { + /* Constants + -------------------------------*/ + const REQUEST_URL = 'https://api.twitter.com/oauth/request_token'; + const AUTHORIZE_URL = 'https://api.twitter.com/oauth/authorize'; + const ACCESS_URL = 'https://api.twitter.com/oauth/access_token'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_key = NULL; + protected $_secret = NULL; + + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($key, $secret) { + //argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string'); //Argument 2 must be a string + + $this->_key = $key; + $this->_secret = $secret; + } + + /* Public Methods + -------------------------------*/ + /** + * Returns the access token + * + * @param string the response key; from the url usually + * @param string the request secret; from getRequestToken() usually + * @return string the response verifier; from the url usually + */ + public function getAccessToken($token, $secret, $verifier) { + //argument test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'string'); //Argument 3 must be a string + + return Eden_Oauth::i() + ->consumer( + self::ACCESS_URL, + $this->_key, + $this->_secret) + ->useAuthorization() + ->setMethodToPost() + ->setToken($token, $secret) + ->setVerifier($verifier) + ->setSignatureToHmacSha1() + ->getQueryResponse(); + } + + /** + * Returns the URL used for login. + * + * @param string the request key + * @param string + * @param boolean force user re-login + * @return string + */ + public function getLoginUrl($token, $redirect, $force_login = false) { + //Argument tests + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string') //Argument 2 must be a string + ->argument(3, 'bool'); //Argument 3 must be a boolean + + //build the query + $query = array('oauth_token' => $token, 'oauth_callback' => $redirect, 'force_login' => (int)$force_login); + $query = http_build_query($query); + + return self::AUTHORIZE_URL.'?'.$query; + } + + /** + * Return a request token + * + * @return string + */ + public function getRequestToken() { + return Eden_Oauth::i() + ->consumer( + self::REQUEST_URL, + $this->_key, + $this->_secret) + ->useAuthorization() + ->setMethodToPost() + ->setSignatureToHmacSha1() + ->getQueryResponse(); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/saved.php b/library/eden/twitter/saved.php index 3928168..fef782a 100644 --- a/library/eden/twitter/saved.php +++ b/library/eden/twitter/saved.php @@ -1,105 +1,105 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter saved searches - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Twitter_Saved extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_SAVED_SEARCHES = 'https://api.twitter.com/1/saved_searches.json'; - const URL_GET_DETAIL = 'https://api.twitter.com/1/saved_searches/show/%d.json'; - const URL_CREATE_SEARCH = 'https://api.twitter.com/1/saved_searches/create.json'; - const URL_REMOVE = 'https://api.twitter.com/1/saved_searches/destroy/%d.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Create a new saved search for the authenticated user. - * A user may only have 25 saved searches. - * - * @param string - * @return array - */ - public function createSearch($input) { - //Argument 1 must be a integer - Eden_Twitter_Error::i()->argument(1, 'string'); - - $query = array('query' => $input); - - $url = sprintf(self::URL_CREATE_SEARCH, $input); - return $this->_post($url,$query); - } - - /** - * Retrieve the information for the saved search represented - * by the given id. The authenticating user must be the - * owner of saved search ID being requested. - * - * @param int search ID - * @return array - */ - public function getDetail($id) { - //Argument 1 must be a integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $query = array('id' => $id); - - return $this->_getResponse(self::URL_GET_DETAIL, $query); - } - - /** - * Returns the authenticated user's - * saved search queries. - * - * @return array - */ - public function getSavedSearches() { - return $this->_getResponse(self::URL_SAVED_SEARCHES); - } - - /** - * Destroys a saved search for the authenticating user. - * The authenticating user must be the owner of - * saved search id being destroyed. - * - * @param int search ID - * @return array - */ - public function remove($id) { - //Argument 1 must be a integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $query = array('id' => $id); - - $url = sprintf(self::URL_REMOVE, $id); - return $this->_post($url,$query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter saved searches + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Twitter_Saved extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_SAVED_SEARCHES = 'https://api.twitter.com/1/saved_searches.json'; + const URL_GET_DETAIL = 'https://api.twitter.com/1/saved_searches/show/%d.json'; + const URL_CREATE_SEARCH = 'https://api.twitter.com/1/saved_searches/create.json'; + const URL_REMOVE = 'https://api.twitter.com/1/saved_searches/destroy/%d.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Create a new saved search for the authenticated user. + * A user may only have 25 saved searches. + * + * @param string + * @return array + */ + public function createSearch($input) { + //Argument 1 must be a integer + Eden_Twitter_Error::i()->argument(1, 'string'); + + $query = array('query' => $input); + + $url = sprintf(self::URL_CREATE_SEARCH, $input); + return $this->_post($url,$query); + } + + /** + * Retrieve the information for the saved search represented + * by the given id. The authenticating user must be the + * owner of saved search ID being requested. + * + * @param int search ID + * @return array + */ + public function getDetail($id) { + //Argument 1 must be a integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $query = array('id' => $id); + + return $this->_getResponse(self::URL_GET_DETAIL, $query); + } + + /** + * Returns the authenticated user's + * saved search queries. + * + * @return array + */ + public function getSavedSearches() { + return $this->_getResponse(self::URL_SAVED_SEARCHES); + } + + /** + * Destroys a saved search for the authenticating user. + * The authenticating user must be the owner of + * saved search id being destroyed. + * + * @param int search ID + * @return array + */ + public function remove($id) { + //Argument 1 must be a integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $query = array('id' => $id); + + $url = sprintf(self::URL_REMOVE, $id); + return $this->_post($url,$query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/search.php b/library/eden/twitter/search.php index fa6c9d6..800f458 100644 --- a/library/eden/twitter/search.php +++ b/library/eden/twitter/search.php @@ -1,284 +1,284 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter search - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Twitter_Search extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_SEARCH = 'http://search.twitter.com/search.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected static $_validResult = array('mixed', 'recent', 'popular'); - - protected $_callback = NULL; - protected $_geocode = NULL; - protected $_lang = NULL; - protected $_locale = NULL; - protected $_page = NULL; - protected $_result = NULL; - protected $_rpp = 25; - protected $_until = NULL; - protected $_since = 0; - protected $_show = 0; - protected $_entities = false; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns tweets that match a specified query - * - * @param string|integer - * @return array - */ - public function search($search) { - //Argument 1 must be a string or integer - Eden_Twitter_Error::i()->argument(1, 'string', 'integer'); - - $query = array('q' => $search); - - if($this->_callback) { - $query['callback'] = $this->_callback; - } - - if($this->_geocode) { - $query['geocode'] = $this->_geocode; - } - - if($this->_lang) { - $query['lang'] = $this->_lang; - } - - if($this->_locale) { - $query['locale'] = $this->_locale; - } - - if($this->_page) { - $query['page'] = $this->_page; - } - - if($this->_result) { - $query['result_type'] = $this->_result; - } - - if($this->_rpp) { - $query['rpp'] = $this->_rpp; - } - - if($this->_show) { - $query['show_user'] = $this->_show; - } - - if($this->_until) { - $query['until'] = $this->_until; - } - - if($this->_since) { - $query['since_id'] = $this->_since; - } - - if($this->_entities) { - $query['include_entities'] = 1; - } - - return $this->_getResponse(self::URL_SEARCH, $query); - } - - /** - * Set callback - * - * @param string - * @return this - */ - public function setCallback($callback) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_callback = $callback; - return $this; - } - - /** - * Set include entites - * - * @return this - */ - public function includeEntities() { - $this->_entities = true; - return $this; - } - - /** - * Set geocode - * - * @param string - * @return this - */ - public function setGeocode($geocode) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_geocode = $geocode; - return $this; - } - - /** - * Set lang - * - * @param string - * @return this - */ - public function setLang($lang) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_lang = $lang; - return $this; - } - - /** - * Set locale - * - * @param string - * @return this - */ - public function setLocale($locale) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_locale = $locale; - return $this; - } - - /** - * Set page - * - * @param integer - * @return this - */ - public function setPage($page) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_page = $page; - return $this; - } - - /** - * Set mixed result - * - * @return this - */ - public function setMixedResultType() { - $this->_result = 'mixed'; - return $this; - } - - /** - * Set recent result - * - * @return this - */ - public function setRecentResultType() { - $this->_result = 'recent'; - return $this; - } - - /** - * Set populat result - * - * @return this - */ - public function setPopularResultType() { - $this->_result = 'popular'; - return $this; - } - - /** - * Set rpp - * - * @param int The number of tweets to return per page, up to a max of 100 - * @return this - */ - public function setRpp($rpp) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - if($this->_rpp > 100) { - $this->_rpp = 100; - } - - $this->_rpp = $rpp; - return $this; - } - - /** - * Set since id - * - * @param int - * @return this - */ - public function setSince($since) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_since = $since; - return $this; - } - - /** - * Set show user - * - * @return this - */ - public function showUser() { - $this->_show = true; - return $this; - } - - /** - * Set until - * - * @param string|int unix time for date format - * @return this - */ - public function setUntil($until) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string', 'int'); - - if(is_string($until)) { - $until = strtotime($until); - } - - $until = date('Y-m-d', $until); - $this->_until = $until; - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter search + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Twitter_Search extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_SEARCH = 'http://search.twitter.com/search.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected static $_validResult = array('mixed', 'recent', 'popular'); + + protected $_callback = NULL; + protected $_geocode = NULL; + protected $_lang = NULL; + protected $_locale = NULL; + protected $_page = NULL; + protected $_result = NULL; + protected $_rpp = 25; + protected $_until = NULL; + protected $_since = 0; + protected $_show = 0; + protected $_entities = false; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns tweets that match a specified query + * + * @param string|integer + * @return array + */ + public function search($search) { + //Argument 1 must be a string or integer + Eden_Twitter_Error::i()->argument(1, 'string', 'integer'); + + $query = array('q' => $search); + + if($this->_callback) { + $query['callback'] = $this->_callback; + } + + if($this->_geocode) { + $query['geocode'] = $this->_geocode; + } + + if($this->_lang) { + $query['lang'] = $this->_lang; + } + + if($this->_locale) { + $query['locale'] = $this->_locale; + } + + if($this->_page) { + $query['page'] = $this->_page; + } + + if($this->_result) { + $query['result_type'] = $this->_result; + } + + if($this->_rpp) { + $query['rpp'] = $this->_rpp; + } + + if($this->_show) { + $query['show_user'] = $this->_show; + } + + if($this->_until) { + $query['until'] = $this->_until; + } + + if($this->_since) { + $query['since_id'] = $this->_since; + } + + if($this->_entities) { + $query['include_entities'] = 1; + } + + return $this->_getResponse(self::URL_SEARCH, $query); + } + + /** + * Set callback + * + * @param string + * @return this + */ + public function setCallback($callback) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_callback = $callback; + return $this; + } + + /** + * Set include entites + * + * @return this + */ + public function includeEntities() { + $this->_entities = true; + return $this; + } + + /** + * Set geocode + * + * @param string + * @return this + */ + public function setGeocode($geocode) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_geocode = $geocode; + return $this; + } + + /** + * Set lang + * + * @param string + * @return this + */ + public function setLang($lang) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_lang = $lang; + return $this; + } + + /** + * Set locale + * + * @param string + * @return this + */ + public function setLocale($locale) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_locale = $locale; + return $this; + } + + /** + * Set page + * + * @param integer + * @return this + */ + public function setPage($page) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_page = $page; + return $this; + } + + /** + * Set mixed result + * + * @return this + */ + public function setMixedResultType() { + $this->_result = 'mixed'; + return $this; + } + + /** + * Set recent result + * + * @return this + */ + public function setRecentResultType() { + $this->_result = 'recent'; + return $this; + } + + /** + * Set populat result + * + * @return this + */ + public function setPopularResultType() { + $this->_result = 'popular'; + return $this; + } + + /** + * Set rpp + * + * @param int The number of tweets to return per page, up to a max of 100 + * @return this + */ + public function setRpp($rpp) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + if($this->_rpp > 100) { + $this->_rpp = 100; + } + + $this->_rpp = $rpp; + return $this; + } + + /** + * Set since id + * + * @param int + * @return this + */ + public function setSince($since) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_since = $since; + return $this; + } + + /** + * Set show user + * + * @return this + */ + public function showUser() { + $this->_show = true; + return $this; + } + + /** + * Set until + * + * @param string|int unix time for date format + * @return this + */ + public function setUntil($until) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string', 'int'); + + if(is_string($until)) { + $until = strtotime($until); + } + + $until = date('Y-m-d', $until); + $this->_until = $until; + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/timeline.php b/library/eden/twitter/timeline.php index c581417..6af873b 100644 --- a/library/eden/twitter/timeline.php +++ b/library/eden/twitter/timeline.php @@ -1,492 +1,492 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter timelines - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Twitter_Timeline extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_TIMELINE = 'https://api.twitter.com/1/statuses/home_timeline.json'; - const URL_MENTION = 'https://api.twitter.com/1/statuses/mentions.json'; - const URL_PUBLIC = 'https://api.twitter.com/1/statuses/public_timeline.json'; - const URL_BY_ME = 'https://api.twitter.com/1/statuses/retweeted_by_me.json'; - const URL_TO_ME = 'https://api.twitter.com/1/statuses/retweeted_to_me.json'; - const URL_OF_ME = 'https://api.twitter.com/1/statuses/retweets_of_me.json'; - const URL_USER = 'https://api.twitter.com/1/statuses/user_timeline.json'; - const URL_TO_USER = 'https://api.twitter.com/1/statuses/retweeted_to_user.json'; - const URL_BY_USER = 'https://api.twitter.com/1/statuses/retweeted_by_user.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_count = NULL; - protected $_since = NULL; - protected $_max = NULL; - protected $_page = NULL; - protected $_trim = NULL; - protected $_entities = false; - protected $_rts = false; - protected $_replies = false; - protected $_detail = false; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Set contributors details - * - * @return array - */ - public function addContributorDetail() { - $this->_detail = true; - return $this; - } - - /** - * Set exclude replies - * - * @return array - */ - public function excludeReplies() { - $this->_replies = true; - return $this; - } - - /** - * Returns the 20 most recent retweets posted - * by the authenticating user. - * - * @param string|int|null user ID or screen name - * @return array - */ - public function getRetweets($id = NULL) { - //Argument 1 must be an integer, string or null - Eden_Twitter_Error::i()->argument(1, 'int', 'string', 'null'); - - $query = array(); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_trim) { - $query['trim_user'] = 1; - } - - if($this->_since) { - $query['since_id'] = $this->_since; - } - - if($this->_max) { - $query['max_id'] = $this->_max; - } - - if($this->_page) { - $query['page'] = $this->_page; - } - - if($this->_count) { - $query['count'] = $this->_count; - } - - if(!is_null($id)) { - //if it is integer - if(is_int($id)) { - //lets put it in our query - $query['user_id'] = $id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $id; - } - return $this->_getResponse(self::URL_BY_USER, $query); - } - - return $this->_getResponse(self::URL_BY_ME, $query); - } - - /** - * Returns the 20 most recent statuses posted by the - * authenticating user. It is also possible to request - * another user's timeline by using the screen_name - * or user_id parameter - * - * @param string|int|null user ID or screen name - * @return array - */ - public function getStatuses($id = NULL) { - //Argument 1 must be an integer, string or null - Eden_Twitter_Error::i()->argument(1, 'int', 'string', 'null'); - - $query = array(); - - if(!is_null($id)) { - //if it is integer - if(is_int($id)) { - //lets put it in our query - $query['user_id'] = $id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $id; - } - } - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_rts) { - $query['include_rts'] = 1; - } - - if($this->_replies) { - $query['exclude_replies'] = 1; - } - - if($this->_trim) { - $query['trim_user'] = 1; - } - - if($this->_detail) { - $query['contributor_details'] = 1; - } - - if($this->_since) { - $query['since_id'] = $this->_since; - } - - if($this->_max) { - $query['max_id'] = $this->_max; - } - - if($this->_page) { - $query['page'] = $this->_page; - } - - if($this->_count) { - $query['count'] = $this->_count; - } - - return $this->_getResponse(self::URL_USER, $query); - } - - /** - * Returns the 20 most recent mentions (status containing @username) - * for the authenticating user - * - * @return array - */ - public function getMentions() { - $query = array(); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_rts) { - $query['include_rts'] = 1; - } - - if($this->_trim) { - $query['trim_user'] = 1; - } - - if($this->_detail) { - $query['contributor_details'] = 1; - } - - if($this->_since) { - $query['since_id'] = $this->_since; - } - - if($this->_max) { - $query['max_id'] = $this->_max; - } - - if($this->_page) { - $query['page'] = $this->_page; - } - - if($this->_count) { - $query['count'] = $this->_count; - } - - return $this->_getResponse(self::URL_MENTION, $query); - } - - /** - * Returns the 20 most recent tweets of the authenticated - * user that have been retweeted by others. - * - * @return array - */ - public function getRetweeted() { - $query = array(); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_trim) { - $query['trim_user'] = 1; - } - - if($this->_since) { - $query['since_id'] = $this->_since; - } - - if($this->_max) { - $query['max_id'] = $this->_max; - } - - if($this->_page) { - $query['page'] = $this->_page; - } - - if($this->_count) { - $query['count'] = $this->_count; - } - - return $this->_getResponse(self::URL_OF_ME, $query); - } - - /** - * Returns the 20 most recent statuses, including - * retweets if they exist. - * - * @return array - */ - public function getAllTweets() { - $query = array(); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_trim) { - $query['trim_user'] = 1; - } - - return $this->_getResponse(self::URL_PUBLIC, $query); - } - - /** - * Returns the 20 most recent statuses, including retweets - * if they exist, posted by the authenticating user and - * the user's they follow. This is the same timeline seen - * by a user when they login to twitter.com. - * - * @return array - */ - public function getTimeline() { - $query = array(); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_rts) { - $query['include_rts'] = 1; - } - - if($this->_replies) { - $query['exclude_replies'] = 1; - } - - if($this->_trim) { - $query['trim_user'] = 1; - } - - if($this->_detail) { - $query['contributor_details'] = 1; - } - - if($this->_since) { - $query['since_id'] = $this->_since; - } - - if($this->_max) { - $query['max_id'] = $this->_max; - } - - if($this->_page) { - $query['page'] = $this->_page; - } - - if($this->_count) { - $query['count'] = $this->_count; - } - - return $this->_getResponse(self::URL_TIMELINE, $query); - } - - /** - * Returns the 20 most recent retweets posted by - * users the authenticating user follow - * - * @param string|int|null user ID or screen name - * @return array - */ - public function getFollowingRetweets($id = NULL) { - //Argument 1 must be an integer, string or null - Eden_Twitter_Error::i()->argument(1, 'int', 'string', 'null'); - - $query = array(); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_trim) { - $query['trim_user'] = 1; - } - - if($this->_since) { - $query['since_id'] = $this->_since; - } - - if($this->_max) { - $query['max_id'] = $this->_max; - } - - if($this->_page) { - $query['page'] = $this->_page; - } - - if($this->_count) { - $query['count'] = $this->_count; - } - - if(!is_null($id)) { - //if it is integer - if(is_int($id)) { - //lets put it in our query - $query['user_id'] = $id; - //else it is string - } else { - //lets put it in our query - $query['screen_name'] = $id; - } - - return $this->_getResponse(self::URL_TO_USER, $query); - } - - return $this->_getResponse(self::URL_TO_ME, $query); - } - - /** - * Each tweet will include a node called "entities". This node offers a variety - * of metadata about the tweet in a discreet structure, including: user_mentions, - * urls, and hashtags. - * - * @return this - */ - public function includeEntities() { - $this->_entities = true; - return $this; - } - - /** - * The list timeline will contain native retweets (if they exist) in addition to the - * standard stream of tweets. The output format of retweeted tweets is identical to - * the representation you see in home_timeline. - * - * @return this - */ - public function includeRts() { - $this->_rts = true; - return $this; - } - - /** - * Set count - * - * @param integer - * @return array - */ - public function setCount($count) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_count = $count; - return $this; - } - - /** - * Set max id - * - * @param integer - * @return array - */ - public function setMax($max) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_max = $max; - return $this; - } - - /** - * Set page - * - * @param integer - * @return array - */ - public function setPage($page) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_page = $page; - return $this; - } - - /** - * Set since id - * - * @param integer - * @return array - */ - public function setSince($since) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_since = $since; - return $this; - } - - /** - * Set trim user - * - * @return array - */ - public function trimUser() { - $this->_trim = true; - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter timelines + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Twitter_Timeline extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_TIMELINE = 'https://api.twitter.com/1/statuses/home_timeline.json'; + const URL_MENTION = 'https://api.twitter.com/1/statuses/mentions.json'; + const URL_PUBLIC = 'https://api.twitter.com/1/statuses/public_timeline.json'; + const URL_BY_ME = 'https://api.twitter.com/1/statuses/retweeted_by_me.json'; + const URL_TO_ME = 'https://api.twitter.com/1/statuses/retweeted_to_me.json'; + const URL_OF_ME = 'https://api.twitter.com/1/statuses/retweets_of_me.json'; + const URL_USER = 'https://api.twitter.com/1/statuses/user_timeline.json'; + const URL_TO_USER = 'https://api.twitter.com/1/statuses/retweeted_to_user.json'; + const URL_BY_USER = 'https://api.twitter.com/1/statuses/retweeted_by_user.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_count = NULL; + protected $_since = NULL; + protected $_max = NULL; + protected $_page = NULL; + protected $_trim = NULL; + protected $_entities = false; + protected $_rts = false; + protected $_replies = false; + protected $_detail = false; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Set contributors details + * + * @return array + */ + public function addContributorDetail() { + $this->_detail = true; + return $this; + } + + /** + * Set exclude replies + * + * @return array + */ + public function excludeReplies() { + $this->_replies = true; + return $this; + } + + /** + * Returns the 20 most recent retweets posted + * by the authenticating user. + * + * @param string|int|null user ID or screen name + * @return array + */ + public function getRetweets($id = NULL) { + //Argument 1 must be an integer, string or null + Eden_Twitter_Error::i()->argument(1, 'int', 'string', 'null'); + + $query = array(); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_trim) { + $query['trim_user'] = 1; + } + + if($this->_since) { + $query['since_id'] = $this->_since; + } + + if($this->_max) { + $query['max_id'] = $this->_max; + } + + if($this->_page) { + $query['page'] = $this->_page; + } + + if($this->_count) { + $query['count'] = $this->_count; + } + + if(!is_null($id)) { + //if it is integer + if(is_int($id)) { + //lets put it in our query + $query['user_id'] = $id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $id; + } + return $this->_getResponse(self::URL_BY_USER, $query); + } + + return $this->_getResponse(self::URL_BY_ME, $query); + } + + /** + * Returns the 20 most recent statuses posted by the + * authenticating user. It is also possible to request + * another user's timeline by using the screen_name + * or user_id parameter + * + * @param string|int|null user ID or screen name + * @return array + */ + public function getStatuses($id = NULL) { + //Argument 1 must be an integer, string or null + Eden_Twitter_Error::i()->argument(1, 'int', 'string', 'null'); + + $query = array(); + + if(!is_null($id)) { + //if it is integer + if(is_int($id)) { + //lets put it in our query + $query['user_id'] = $id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $id; + } + } + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_rts) { + $query['include_rts'] = 1; + } + + if($this->_replies) { + $query['exclude_replies'] = 1; + } + + if($this->_trim) { + $query['trim_user'] = 1; + } + + if($this->_detail) { + $query['contributor_details'] = 1; + } + + if($this->_since) { + $query['since_id'] = $this->_since; + } + + if($this->_max) { + $query['max_id'] = $this->_max; + } + + if($this->_page) { + $query['page'] = $this->_page; + } + + if($this->_count) { + $query['count'] = $this->_count; + } + + return $this->_getResponse(self::URL_USER, $query); + } + + /** + * Returns the 20 most recent mentions (status containing @username) + * for the authenticating user + * + * @return array + */ + public function getMentions() { + $query = array(); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_rts) { + $query['include_rts'] = 1; + } + + if($this->_trim) { + $query['trim_user'] = 1; + } + + if($this->_detail) { + $query['contributor_details'] = 1; + } + + if($this->_since) { + $query['since_id'] = $this->_since; + } + + if($this->_max) { + $query['max_id'] = $this->_max; + } + + if($this->_page) { + $query['page'] = $this->_page; + } + + if($this->_count) { + $query['count'] = $this->_count; + } + + return $this->_getResponse(self::URL_MENTION, $query); + } + + /** + * Returns the 20 most recent tweets of the authenticated + * user that have been retweeted by others. + * + * @return array + */ + public function getRetweeted() { + $query = array(); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_trim) { + $query['trim_user'] = 1; + } + + if($this->_since) { + $query['since_id'] = $this->_since; + } + + if($this->_max) { + $query['max_id'] = $this->_max; + } + + if($this->_page) { + $query['page'] = $this->_page; + } + + if($this->_count) { + $query['count'] = $this->_count; + } + + return $this->_getResponse(self::URL_OF_ME, $query); + } + + /** + * Returns the 20 most recent statuses, including + * retweets if they exist. + * + * @return array + */ + public function getAllTweets() { + $query = array(); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_trim) { + $query['trim_user'] = 1; + } + + return $this->_getResponse(self::URL_PUBLIC, $query); + } + + /** + * Returns the 20 most recent statuses, including retweets + * if they exist, posted by the authenticating user and + * the user's they follow. This is the same timeline seen + * by a user when they login to twitter.com. + * + * @return array + */ + public function getTimeline() { + $query = array(); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_rts) { + $query['include_rts'] = 1; + } + + if($this->_replies) { + $query['exclude_replies'] = 1; + } + + if($this->_trim) { + $query['trim_user'] = 1; + } + + if($this->_detail) { + $query['contributor_details'] = 1; + } + + if($this->_since) { + $query['since_id'] = $this->_since; + } + + if($this->_max) { + $query['max_id'] = $this->_max; + } + + if($this->_page) { + $query['page'] = $this->_page; + } + + if($this->_count) { + $query['count'] = $this->_count; + } + + return $this->_getResponse(self::URL_TIMELINE, $query); + } + + /** + * Returns the 20 most recent retweets posted by + * users the authenticating user follow + * + * @param string|int|null user ID or screen name + * @return array + */ + public function getFollowingRetweets($id = NULL) { + //Argument 1 must be an integer, string or null + Eden_Twitter_Error::i()->argument(1, 'int', 'string', 'null'); + + $query = array(); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_trim) { + $query['trim_user'] = 1; + } + + if($this->_since) { + $query['since_id'] = $this->_since; + } + + if($this->_max) { + $query['max_id'] = $this->_max; + } + + if($this->_page) { + $query['page'] = $this->_page; + } + + if($this->_count) { + $query['count'] = $this->_count; + } + + if(!is_null($id)) { + //if it is integer + if(is_int($id)) { + //lets put it in our query + $query['user_id'] = $id; + //else it is string + } else { + //lets put it in our query + $query['screen_name'] = $id; + } + + return $this->_getResponse(self::URL_TO_USER, $query); + } + + return $this->_getResponse(self::URL_TO_ME, $query); + } + + /** + * Each tweet will include a node called "entities". This node offers a variety + * of metadata about the tweet in a discreet structure, including: user_mentions, + * urls, and hashtags. + * + * @return this + */ + public function includeEntities() { + $this->_entities = true; + return $this; + } + + /** + * The list timeline will contain native retweets (if they exist) in addition to the + * standard stream of tweets. The output format of retweeted tweets is identical to + * the representation you see in home_timeline. + * + * @return this + */ + public function includeRts() { + $this->_rts = true; + return $this; + } + + /** + * Set count + * + * @param integer + * @return array + */ + public function setCount($count) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_count = $count; + return $this; + } + + /** + * Set max id + * + * @param integer + * @return array + */ + public function setMax($max) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_max = $max; + return $this; + } + + /** + * Set page + * + * @param integer + * @return array + */ + public function setPage($page) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_page = $page; + return $this; + } + + /** + * Set since id + * + * @param integer + * @return array + */ + public function setSince($since) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_since = $since; + return $this; + } + + /** + * Set trim user + * + * @return array + */ + public function trimUser() { + $this->_trim = true; + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/tweets.php b/library/eden/twitter/tweets.php index c95e013..a8a9ac8 100644 --- a/library/eden/twitter/tweets.php +++ b/library/eden/twitter/tweets.php @@ -1,455 +1,455 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter tweets - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Twitter_Tweets extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_WHO_RETWEETED = 'https://api.twitter.com/1/statuses/%s/retweeted_by.json'; - const URL_GET_WHO_RETWEETED_IDS = 'https://api.twitter.com/1/statuses/%d/retweeted_by/ids.json'; - const URL_GET_RETWEETS = 'https://api.twitter.com/1/statuses/retweets/%s.json'; - const URL_GET_LIST = 'https://api.twitter.com/1/statuses/show.json'; - const URL_REMOVE = 'http://api.twitter.com/1/statuses/destroy/%s.json'; - const URL_RETWEET = 'http://api.twitter.com/1/statuses/retweet/%d.json'; - const URL_UPDATE = 'https://api.twitter.com/1/statuses/update.json'; - const URL_UPDATE_MEDIA = 'https://upload.twitter.com/1/statuses/update_with_media.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_latitude = NULL; - protected $_longtitude = NULL; - protected $_count = 0; - protected $_page = 0; - protected $_reply = NULL; - protected $_place = NULL; - protected $_stringify = false; - protected $_entities = false; - protected $_trim = false; - protected $_display = false; - protected $_wrap = false; - protected $_sensitive = false; - - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Set display coordinates - * - * @return array - */ - public function displayCoordinates() { - $this->_display = true; - return $this; - } - - /** - * Set include entities - * - * @return array - */ - public function includeEntities() { - $this->_entities = true; - return $this; - } - - /** - * Set possibly sensitive - * - * @return array - */ - public function isSensitive() { - $this->_sensitive = true; - return $this; - } - - /** - * Returns a single status, specified by the id parameter below. - * The status's author will be returned inline. - * - * @param integer - * @return array - */ - public function getDetail($id) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $query = array('id' => $id); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_trim) { - $query['trim_user'] = 1; - } - - return $this->_getResponse(self::URL_GET_LIST, $query); - } - - /** - * Returns up to 100 of the first retweets of a given tweet. - * - * @param integer - * @return array - */ - public function getRetweets($id) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $query = array('id' => $id); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_trim) { - $query['trim_user'] = 1; - } - - if($this->_count) { - $query['count'] = $this->_count; - } - - $url = sprintf(self::URL_GET_RETWEETS, $id); - return $this->_post($url, $query); - } - - /** - * Show user objects of up to 100 members - * who retweeted the status. - * - * @param integer - * @return array - */ - public function getWhoRetweeted($id) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $query = array('id' => $id); - - if($this->_page) { - $query['page'] = $this->_page; - } - - if($this->_count) { - $query['count'] = $this->_count; - } - } - - /** - * Show user ids of up to 100 users who - * retweeted the status. - * - * @param integer - * @return array - */ - public function getWhoRetweetedIds($id) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $query = array('id' => $id); - - if($this->_page) { - $query['page'] = $this->_page; - } - - if($this->_count) { - $query['count'] = $this->_count; - } - - if($this->_stringify) { - $query['stringify_ids'] = 1; - } - - $url = sprintf(self::URL_GET_WHO_RETWEETED_IDS, $id); - return $this->_post($url, $query); - } - - /** - * Destroys the status specified by the required ID parameter. - * The authenticating user must be the author of the specified . - * status. Returns the destroyed status if successful. - * - * @param integer - * @return array - */ - public function remove($id) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $query = array('id' => $id); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_trim) { - $query['trim_user'] = 1; - } - - $url = sprintf(self::URL_REMOVE, $id); - return $this->_post($url,$query); - } - - /** - * Set in reply to status id - * - * @param string - * @return array - */ - public function replyTo($reply) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_reply = $reply; - return $this; - } - - /** - * Retweets a tweet. Returns the original tweet - * with retweet details embedded - * - * @param integer - * @return array - */ - public function retweet($id) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - //populate fields - $query = array('id' => $id); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_trim) { - $query['trim_user'] = 1; - } - - $url = sprintf(self::URL_RETWEET, $id); - return $this->_post($url, $query); - } - - /** - * Set count - * - * @param integer - * @return array - */ - public function setCount($count) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_count = $count; - return $this; - } - - /** - * Set latitude - * - * @param float - * @return this - */ - public function setLatitude($latitude) { - //Argument 1 must be a float - Eden_Twitter_Error::i()->argument(1, 'float'); - - $this->_latitude = $latitude; - return $this; - } - - /** - * Set longtitude - * - * @param float - * @return this - */ - public function setLongtitude($longtitude) { - //Argument 1 must be a float - Eden_Twitter_Error::i()->argument(1, 'float'); - - $this->_longtitude = $longtitude; - return $this; - } - - /** - * Set page - * - * @param integer - * @return array - */ - public function setPage($page) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_page = $page; - return $this; - } - - /** - * Set place id - * - * @param string|integer - * @return array - */ - public function setPlace($place) { - //Argument 1 must be a string or integer - Eden_Twitter_Error::i()->argument(1, 'string', 'int'); - - $this->_place = $place; - return $this; - } - - /** - * Set stringify ids - * - * @return array - */ - public function stringify() { - $this->_stringify = true; - return $this; - } - - /** - * Set trim user - * - * @return array - */ - public function trimUser() { - $this->_trim = true; - return $this; - } - - /** - * Updates the authenticating user's status, - * also known as tweeting. - * - * @param string - * @return array - */ - public function update($status) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $query = array('status' => $status); - - if($this->_reply) { - $query['in_reply_to_status_id'] = $this->_reply; - } - - if($this->_latitude) { - $query['lat'] = $this->_latitude; - } - - if($this->_longtitude) { - $query['long'] = $this->_longtitude; - } - - if($this->_place) { - $query['place_id'] = $this->_place; - } - - if($this->_display) { - $query['display_coordinates'] = 1; - } - - if($this->_trim) { - $query['trim_user'] = 1; - } - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_wrap) { - $query['wrap_links'] = 1; - } - - return $this->_post(self::URL_UPDATE, $query); - } - - /** - * Updates the authenticating user's status, - * also known as tweeting. - * - * @param string - * @param string - * @return array - */ - public function updateMedia($status, $media) { - //Argument Test - Eden_Twitter_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string'); //Argument 2 must be a string - - //populate fields - $query = array( - 'media[]' => $media, - 'status' => $status); - - if($this->_reply) { - $query['in_reply_to_status_id'] = $this->_reply; - } - - if($this->_latitude) { - $query['lat'] = $this->_latitude; - } - - if($this->_longtitude) { - $query['long'] = $this->_longtitude; - } - - if($this->_place) { - $query['place_id'] = $this->_place; - } - - if($this->_sensitive) { - $query['possibly_sensitive'] = 1; - } - - if($this->_display) { - $query['display_coordinates'] = 1; - } - - return $this->_upload(self::URL_UPDATE_MEDIA, $query); - } - - /** - * Set wrap links - * - * @return array - */ - public function wrapLinks() { - $this->_wrap = true; - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter tweets + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Twitter_Tweets extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_WHO_RETWEETED = 'https://api.twitter.com/1/statuses/%s/retweeted_by.json'; + const URL_GET_WHO_RETWEETED_IDS = 'https://api.twitter.com/1/statuses/%d/retweeted_by/ids.json'; + const URL_GET_RETWEETS = 'https://api.twitter.com/1/statuses/retweets/%s.json'; + const URL_GET_LIST = 'https://api.twitter.com/1/statuses/show.json'; + const URL_REMOVE = 'http://api.twitter.com/1/statuses/destroy/%s.json'; + const URL_RETWEET = 'http://api.twitter.com/1/statuses/retweet/%d.json'; + const URL_UPDATE = 'https://api.twitter.com/1/statuses/update.json'; + const URL_UPDATE_MEDIA = 'https://upload.twitter.com/1/statuses/update_with_media.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_latitude = NULL; + protected $_longtitude = NULL; + protected $_count = 0; + protected $_page = 0; + protected $_reply = NULL; + protected $_place = NULL; + protected $_stringify = false; + protected $_entities = false; + protected $_trim = false; + protected $_display = false; + protected $_wrap = false; + protected $_sensitive = false; + + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Set display coordinates + * + * @return array + */ + public function displayCoordinates() { + $this->_display = true; + return $this; + } + + /** + * Set include entities + * + * @return array + */ + public function includeEntities() { + $this->_entities = true; + return $this; + } + + /** + * Set possibly sensitive + * + * @return array + */ + public function isSensitive() { + $this->_sensitive = true; + return $this; + } + + /** + * Returns a single status, specified by the id parameter below. + * The status's author will be returned inline. + * + * @param integer + * @return array + */ + public function getDetail($id) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $query = array('id' => $id); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_trim) { + $query['trim_user'] = 1; + } + + return $this->_getResponse(self::URL_GET_LIST, $query); + } + + /** + * Returns up to 100 of the first retweets of a given tweet. + * + * @param integer + * @return array + */ + public function getRetweets($id) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $query = array('id' => $id); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_trim) { + $query['trim_user'] = 1; + } + + if($this->_count) { + $query['count'] = $this->_count; + } + + $url = sprintf(self::URL_GET_RETWEETS, $id); + return $this->_post($url, $query); + } + + /** + * Show user objects of up to 100 members + * who retweeted the status. + * + * @param integer + * @return array + */ + public function getWhoRetweeted($id) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $query = array('id' => $id); + + if($this->_page) { + $query['page'] = $this->_page; + } + + if($this->_count) { + $query['count'] = $this->_count; + } + } + + /** + * Show user ids of up to 100 users who + * retweeted the status. + * + * @param integer + * @return array + */ + public function getWhoRetweetedIds($id) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $query = array('id' => $id); + + if($this->_page) { + $query['page'] = $this->_page; + } + + if($this->_count) { + $query['count'] = $this->_count; + } + + if($this->_stringify) { + $query['stringify_ids'] = 1; + } + + $url = sprintf(self::URL_GET_WHO_RETWEETED_IDS, $id); + return $this->_post($url, $query); + } + + /** + * Destroys the status specified by the required ID parameter. + * The authenticating user must be the author of the specified . + * status. Returns the destroyed status if successful. + * + * @param integer + * @return array + */ + public function remove($id) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $query = array('id' => $id); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_trim) { + $query['trim_user'] = 1; + } + + $url = sprintf(self::URL_REMOVE, $id); + return $this->_post($url,$query); + } + + /** + * Set in reply to status id + * + * @param string + * @return array + */ + public function replyTo($reply) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_reply = $reply; + return $this; + } + + /** + * Retweets a tweet. Returns the original tweet + * with retweet details embedded + * + * @param integer + * @return array + */ + public function retweet($id) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + //populate fields + $query = array('id' => $id); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_trim) { + $query['trim_user'] = 1; + } + + $url = sprintf(self::URL_RETWEET, $id); + return $this->_post($url, $query); + } + + /** + * Set count + * + * @param integer + * @return array + */ + public function setCount($count) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_count = $count; + return $this; + } + + /** + * Set latitude + * + * @param float + * @return this + */ + public function setLatitude($latitude) { + //Argument 1 must be a float + Eden_Twitter_Error::i()->argument(1, 'float'); + + $this->_latitude = $latitude; + return $this; + } + + /** + * Set longtitude + * + * @param float + * @return this + */ + public function setLongtitude($longtitude) { + //Argument 1 must be a float + Eden_Twitter_Error::i()->argument(1, 'float'); + + $this->_longtitude = $longtitude; + return $this; + } + + /** + * Set page + * + * @param integer + * @return array + */ + public function setPage($page) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_page = $page; + return $this; + } + + /** + * Set place id + * + * @param string|integer + * @return array + */ + public function setPlace($place) { + //Argument 1 must be a string or integer + Eden_Twitter_Error::i()->argument(1, 'string', 'int'); + + $this->_place = $place; + return $this; + } + + /** + * Set stringify ids + * + * @return array + */ + public function stringify() { + $this->_stringify = true; + return $this; + } + + /** + * Set trim user + * + * @return array + */ + public function trimUser() { + $this->_trim = true; + return $this; + } + + /** + * Updates the authenticating user's status, + * also known as tweeting. + * + * @param string + * @return array + */ + public function update($status) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $query = array('status' => $status); + + if($this->_reply) { + $query['in_reply_to_status_id'] = $this->_reply; + } + + if($this->_latitude) { + $query['lat'] = $this->_latitude; + } + + if($this->_longtitude) { + $query['long'] = $this->_longtitude; + } + + if($this->_place) { + $query['place_id'] = $this->_place; + } + + if($this->_display) { + $query['display_coordinates'] = 1; + } + + if($this->_trim) { + $query['trim_user'] = 1; + } + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_wrap) { + $query['wrap_links'] = 1; + } + + return $this->_post(self::URL_UPDATE, $query); + } + + /** + * Updates the authenticating user's status, + * also known as tweeting. + * + * @param string + * @param string + * @return array + */ + public function updateMedia($status, $media) { + //Argument Test + Eden_Twitter_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string'); //Argument 2 must be a string + + //populate fields + $query = array( + 'media[]' => $media, + 'status' => $status); + + if($this->_reply) { + $query['in_reply_to_status_id'] = $this->_reply; + } + + if($this->_latitude) { + $query['lat'] = $this->_latitude; + } + + if($this->_longtitude) { + $query['long'] = $this->_longtitude; + } + + if($this->_place) { + $query['place_id'] = $this->_place; + } + + if($this->_sensitive) { + $query['possibly_sensitive'] = 1; + } + + if($this->_display) { + $query['display_coordinates'] = 1; + } + + return $this->_upload(self::URL_UPDATE_MEDIA, $query); + } + + /** + * Set wrap links + * + * @return array + */ + public function wrapLinks() { + $this->_wrap = true; + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/twitter/users.php b/library/eden/twitter/users.php index fd757b2..4272468 100644 --- a/library/eden/twitter/users.php +++ b/library/eden/twitter/users.php @@ -1,295 +1,295 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Twitter users - * - * @package Eden - * @category twitter - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Twitter_Users extends Eden_Twitter_Base { - /* Constants - -------------------------------*/ - const URL_LOOK_UP = 'https://api.twitter.com/1/users/lookup.json'; - const URL_PROFILE_IMAGE = 'https://api.twitter.com/1/users/profile_image.json'; - const URL_SEARCH = 'https://api.twitter.com/1/users/search.json'; - const URL_SHOW = 'https://api.twitter.com/1/users/show.json'; - const URL_CONTRIBUTEES = 'https://api.twitter.com/1/users/contributees.json'; - const URL_CONTRIBUTORS = 'https://api.twitter.com/1/users/contributors.json'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_id = NULL; - protected $_name = NULL; - protected $_size = NULL; - protected $_page = NULL; - protected $_perpage = NULL; - protected $_entities = NULL; - protected $_status = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Returns an array of users that - * the specified user can contribute to. - * - * @return array - */ - public function getContributees() { - $query = array(); - - if($this->_id) { - $query['user_id'] = $this->_id; - } - - if($this->_name) { - $query['screen_name'] = $this->_name; - } - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_status) { - $query['skip_status'] = 1; - } - - return $this->_getResponse(self::URL_CONTRIBUTEES, $query); - } - - /** - * Returns an array of users that - * the specified user can contribute to. - * - * @return array - */ - public function getContributors() { - $query = array(); - - if($this->_id) { - $query['user_id'] = $this->_id; - } - - if($this->_name) { - $query['screen_name'] = $this->_name; - } - - if($this->_entities) { - $query['include_entities'] = 1; - } - - if($this->_status) { - $query['skip_status'] = 1; - } - - return $this->_getResponse(self::URL_CONTRIBUTORS, $query); - } - - /** - * Returns extended information of a given user, specified - * by ID or screen name as per the required id parameter. - * - * @param int user ID - * @return array - */ - public function getDetail($id) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1,'int'); - - $query = array('user_id' => $id); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - return $this->_getResponse(self::URL_SHOW, $query); - } - - /** - * Access the profile image in various sizes - * for the user with the indicated screen_name. - * If no size is provided the normal image is returned. - * - * @return array - */ - public function getProfileImage() { - //populate fields - $query = array( - 'screen_name' => $this->_name, - 'size' => $this->_size); - - return $this->_getResponse(self::URL_PROFILE_IMAGE, $query); - } - - /** - * Return up to 100 users worth of extended information, - * specified by either ID, screen name, or combination of the two. - * - * @return array - */ - public function lookupFriends() { - $query = array(); - - if($this->_entities) { - $query['include_entities'] = 1; - } - - //if id is integer - if(is_int($this->_id)) { - $this->_id = explode(',', $this->_id); - //at this point id will be an array - $this->_id = array(); - //lets put it in query - $query['user_id'] = $this->_id; - } - - //if name is string - if(is_string($this->_name)) { - $this->_name = explode(',', $this->_name); - //at this point id will be an array - $this->_name = array(); - $query['screen_name'] = $this->_name; - } - - return $this->_getResponse(self::URL_LOOK_UP, $query); - } - - /** - * Set include entities - * - * @return array - */ - public function includeEntities() { - $this->_entities = true; - return $this; - } - - /** - * Set user id - * - * @param integer - * @return array - */ - public function setUserId($id) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_id = $id; - return $this; - } - - /** - * Set screen name - * - * @param string - * @return array - */ - public function setScreenName($name) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_name = $name; - return $this; - } - - /** - * Set page - * - * @param integer - * @return array - */ - public function setPage($page) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_page = $page; - return $this; - } - - /** - * Set per page - * - * @param integer - * @return array - */ - public function setPerpage($perpage) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'int'); - - $this->_perpage = $perpage; - return $this; - } - - /** - * Set size - * - * @param string - * @return array - */ - public function setSize($size) { - //Argument 1 must be an integer - Eden_Twitter_Error::i()->argument(1, 'string'); - - $this->_size = $size; - return $this; - } - - /** - * Set skip status - * - * @return array - */ - public function skipStatus() { - $this->_status = true; - return $this; - } - - /** - * Runs a search for users similar to find people - * - * @param string - * @return array - */ - public function search($search) { - //Argument 1 must be a string - Eden_Twitter_Error::i()->argument(1, 'string'); - - $query = array('q' => $search); - - if($this->_page) { - $query['page'] = $this->_page; - } - - if($this->_perpage) { - $query['per_page'] = $this->_perpage; - } - - if($this->_entities) { - $query['include_entities'] = 1; - } - - return $this->_getResponse(self::URL_SEARCH, $query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ -} + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Twitter users + * + * @package Eden + * @category twitter + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Twitter_Users extends Eden_Twitter_Base { + /* Constants + -------------------------------*/ + const URL_LOOK_UP = 'https://api.twitter.com/1/users/lookup.json'; + const URL_PROFILE_IMAGE = 'https://api.twitter.com/1/users/profile_image.json'; + const URL_SEARCH = 'https://api.twitter.com/1/users/search.json'; + const URL_SHOW = 'https://api.twitter.com/1/users/show.json'; + const URL_CONTRIBUTEES = 'https://api.twitter.com/1/users/contributees.json'; + const URL_CONTRIBUTORS = 'https://api.twitter.com/1/users/contributors.json'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_id = NULL; + protected $_name = NULL; + protected $_size = NULL; + protected $_page = NULL; + protected $_perpage = NULL; + protected $_entities = NULL; + protected $_status = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Returns an array of users that + * the specified user can contribute to. + * + * @return array + */ + public function getContributees() { + $query = array(); + + if($this->_id) { + $query['user_id'] = $this->_id; + } + + if($this->_name) { + $query['screen_name'] = $this->_name; + } + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_status) { + $query['skip_status'] = 1; + } + + return $this->_getResponse(self::URL_CONTRIBUTEES, $query); + } + + /** + * Returns an array of users that + * the specified user can contribute to. + * + * @return array + */ + public function getContributors() { + $query = array(); + + if($this->_id) { + $query['user_id'] = $this->_id; + } + + if($this->_name) { + $query['screen_name'] = $this->_name; + } + + if($this->_entities) { + $query['include_entities'] = 1; + } + + if($this->_status) { + $query['skip_status'] = 1; + } + + return $this->_getResponse(self::URL_CONTRIBUTORS, $query); + } + + /** + * Returns extended information of a given user, specified + * by ID or screen name as per the required id parameter. + * + * @param int user ID + * @return array + */ + public function getDetail($id) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1,'int'); + + $query = array('user_id' => $id); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + return $this->_getResponse(self::URL_SHOW, $query); + } + + /** + * Access the profile image in various sizes + * for the user with the indicated screen_name. + * If no size is provided the normal image is returned. + * + * @return array + */ + public function getProfileImage() { + //populate fields + $query = array( + 'screen_name' => $this->_name, + 'size' => $this->_size); + + return $this->_getResponse(self::URL_PROFILE_IMAGE, $query); + } + + /** + * Return up to 100 users worth of extended information, + * specified by either ID, screen name, or combination of the two. + * + * @return array + */ + public function lookupFriends() { + $query = array(); + + if($this->_entities) { + $query['include_entities'] = 1; + } + + //if id is integer + if(is_int($this->_id)) { + $this->_id = explode(',', $this->_id); + //at this point id will be an array + $this->_id = array(); + //lets put it in query + $query['user_id'] = $this->_id; + } + + //if name is string + if(is_string($this->_name)) { + $this->_name = explode(',', $this->_name); + //at this point id will be an array + $this->_name = array(); + $query['screen_name'] = $this->_name; + } + + return $this->_getResponse(self::URL_LOOK_UP, $query); + } + + /** + * Set include entities + * + * @return array + */ + public function includeEntities() { + $this->_entities = true; + return $this; + } + + /** + * Set user id + * + * @param integer + * @return array + */ + public function setUserId($id) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_id = $id; + return $this; + } + + /** + * Set screen name + * + * @param string + * @return array + */ + public function setScreenName($name) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_name = $name; + return $this; + } + + /** + * Set page + * + * @param integer + * @return array + */ + public function setPage($page) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_page = $page; + return $this; + } + + /** + * Set per page + * + * @param integer + * @return array + */ + public function setPerpage($perpage) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'int'); + + $this->_perpage = $perpage; + return $this; + } + + /** + * Set size + * + * @param string + * @return array + */ + public function setSize($size) { + //Argument 1 must be an integer + Eden_Twitter_Error::i()->argument(1, 'string'); + + $this->_size = $size; + return $this; + } + + /** + * Set skip status + * + * @return array + */ + public function skipStatus() { + $this->_status = true; + return $this; + } + + /** + * Runs a search for users similar to find people + * + * @param string + * @return array + */ + public function search($search) { + //Argument 1 must be a string + Eden_Twitter_Error::i()->argument(1, 'string'); + + $query = array('q' => $search); + + if($this->_page) { + $query['page'] = $this->_page; + } + + if($this->_perpage) { + $query['per_page'] = $this->_perpage; + } + + if($this->_entities) { + $query['include_entities'] = 1; + } + + return $this->_getResponse(self::URL_SEARCH, $query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ +} diff --git a/library/eden/type.php b/library/eden/type.php index 804d3e0..6d5da7c 100644 --- a/library/eden/type.php +++ b/library/eden/type.php @@ -1,83 +1,83 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/class.php'; -require_once dirname(__FILE__).'/type/error.php'; -require_once dirname(__FILE__).'/type/abstract.php'; -require_once dirname(__FILE__).'/type/array.php'; -require_once dirname(__FILE__).'/type/string.php'; - -/** - * Controller for Data Types - * - * @package Eden - * @category type - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Type extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - public static function i($type = NULL) { - if(func_num_args() > 1) { - $type = func_get_args(); - } - - if(is_array($type)) { - return Eden_Type_Array::i($type); - } - - if(is_string($type)) { - return Eden_Type_String::i($type); - } - - return self::_getSingleton(__CLASS__); - } - - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /** - * Returns the array class - * - * @param array|mixed[,mixed..] - * @return Eden_Type_Array - */ - public function getArray($array) { - $args = func_get_args(); - if(count($args) > 1 || !is_array($array)) { - $array = $args; - } - - return Eden_Type_Array::i($array); - } - - /** - * Returns the string class - * - * @param string - * @return Eden_Type_String - */ - public function getString($string) { - return Eden_Type_String::i($string); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/class.php'; +require_once dirname(__FILE__).'/type/error.php'; +require_once dirname(__FILE__).'/type/abstract.php'; +require_once dirname(__FILE__).'/type/array.php'; +require_once dirname(__FILE__).'/type/string.php'; + +/** + * Controller for Data Types + * + * @package Eden + * @category type + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Type extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + public static function i($type = NULL) { + if(func_num_args() > 1) { + $type = func_get_args(); + } + + if(is_array($type)) { + return Eden_Type_Array::i($type); + } + + if(is_string($type)) { + return Eden_Type_String::i($type); + } + + return self::_getSingleton(__CLASS__); + } + + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /** + * Returns the array class + * + * @param array|mixed[,mixed..] + * @return Eden_Type_Array + */ + public function getArray($array) { + $args = func_get_args(); + if(count($args) > 1 || !is_array($array)) { + $array = $args; + } + + return Eden_Type_Array::i($array); + } + + /** + * Returns the string class + * + * @param string + * @return Eden_Type_String + */ + public function getString($string) { + return Eden_Type_String::i($string); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/type/array.php b/library/eden/type/array.php index 769d11f..de1e767 100644 --- a/library/eden/type/array.php +++ b/library/eden/type/array.php @@ -1,410 +1,410 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Array object - * - * @package Eden - * @category core - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Type_Array extends Eden_Type_Abstract implements ArrayAccess, Iterator, Serializable, Countable { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_data = array(); - protected $_original = array(); - - protected static $_methods = array( - 'array_change_key_case' => self::PRE, 'array_chunk' => self::PRE, - 'array_combine' => self::PRE, 'array_count_datas' => self::PRE, - 'array_diff_assoc' => self::PRE, 'array_diff_key' => self::PRE, - 'array_diff_uassoc' => self::PRE, 'array_diff_ukey' => self::PRE, - 'array_diff' => self::PRE, 'array_fill_keys' => self::PRE, - 'array_filter' => self::PRE, 'array_flip' => self::PRE, - 'array_intersect_assoc' => self::PRE, 'array_intersect_key' => self::PRE, - 'array_intersect_uassoc' => self::PRE, 'array_intersect_ukey' => self::PRE, - 'array_intersect' => self::PRE, 'array_keys' => self::PRE, - 'array_merge_recursive' => self::PRE, 'array_merge' => self::PRE, - 'array_pad' => self::PRE, - 'array_reverse' => self::PRE, 'array_shift' => self::PRE, - 'array_slice' => self::PRE, 'array_splice' => self::PRE, - 'array_sum' => self::PRE, 'array_udiff_assoc' => self::PRE, - 'array_udiff_uassoc' => self::PRE, 'array_udiff' => self::PRE, - 'array_uintersect_assoc' => self::PRE, 'array_uintersect_uassoc' => self::PRE, - 'array_uintersect' => self::PRE, 'array_unique' => self::PRE, - 'array_datas' => self::PRE, 'count' => self::PRE, - 'current' => self::PRE, 'each' => self::PRE, - 'end' => self::PRE, 'extract' => self::PRE, - 'key' => self::PRE, 'next' => self::PRE, - 'prev' => self::PRE, 'sizeof' => self::PRE, - - 'array_fill' => self::POST, 'array_map' => self::POST, - 'array_search' => self::POST, 'compact' => self::POST, - 'implode' => self::POST, 'in_array' => self::POST, - - 'array_unshift' => self::REFERENCE, 'array_walk_recursive' => self::REFERENCE, - 'array_walk' => self::REFERENCE, 'arsort' => self::REFERENCE, - 'asort' => self::REFERENCE, 'krsort' => self::REFERENCE, - 'ksort' => self::REFERENCE, 'natcasesort' => self::REFERENCE, - 'natsort' => self::REFERENCE, 'reset' => self::REFERENCE, - 'rsort' => self::REFERENCE, 'shuffle' => self::REFERENCE, - 'sort' => self::REFERENCE, 'uasort' => self::REFERENCE, - 'uksort' => self::REFERENCE, 'usort' => self::REFERENCE, - 'array_push' => self::REFERENCE); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __call($name, $args) { - //if the method starts with get - if(strpos($name, 'get') === 0) { - //getUserName('-') - $separator = '_'; - if(isset($args[0]) && is_scalar($args[0])) { - $separator = (string) $args[0]; - } - - $key = preg_replace("/([A-Z0-9])/", $separator."$1", $name); - //get rid of get - $key = strtolower(substr($key, 3+strlen($separator))); - - if(isset($this->_data[$key])) { - return $this->_data[$key]; - } - - return NULL; - - } else if (strpos($name, 'set') === 0) { - //setUserName('Chris', '-') - $separator = '_'; - if(isset($args[1]) && is_scalar($args[1])) { - $separator = (string) $args[1]; - } - - $key = preg_replace("/([A-Z0-9])/", $separator."$1", $name); - - //get rid of set - $key = strtolower(substr($key, 3+strlen($separator))); - - $this->__set($key, isset($args[0]) ? $args[0] : NULL); - - return $this; - } - - try { - return parent::__call($name, $args); - } catch(Eden_Error $e) { - Eden_Type_Error::i($e->getMessage())->trigger(); - } - } - - public function __construct($data = array()) { - //if there is more arguments or data is not an array - if(func_num_args() > 1 || !is_array($data)) { - //just get the args - $data = func_get_args(); - } - - parent::__construct($data); - } - - public function __set($name, $value) { - $this->_data[$name] = $value; - } - - public function __toString() { - return json_encode($this->get()); - } - - /* Public Methods - -------------------------------*/ - /** - * Copies the value of source key into destination key - * - * @param string - * @param string - */ - public function copy($source, $destination) { - $this->_data[$destination] = $this->_data[$source]; - return $this; - } - - /** - * returns size using the Countable interface - * - * @return string - */ - public function count() { - return count($this->_data); - } - - /** - * Removes a row in an array and adjusts all the indexes - * - * @param *string the key to leave out - * @return this - */ - public function cut($key) { - //argument 1 must be scalar - Eden_Type_Error::i()->argument(1, 'scalar'); - - //if nothing to cut - if(!isset($this->_data[$key])) { - //do nothing - return $this; - } - - //unset the value - unset($this->_data[$key]); - //reindex the list - $this->_data = array_values($this->_data); - return $this; - } - - /** - * Returns the current item - * For Iterator interface - * - * @return void - */ - public function current() { - return current($this->_data); - } - - /** - * Loops through returned result sets - * - * @param *callable - * @return this - */ - public function each($callback) { - Eden_Error::i()->argument(1, 'callable'); - - foreach($this->_data as $key => $value) { - call_user_func($callback, $key, $value); - } - - return $this; - } - - /** - * Returns if the data is empty - * - * @return bool - */ - public function isEmpty() { - return empty($this->_data); - } - - /** - * Returns th current position - * For Iterator interface - * - * @return void - */ - public function key() { - return key($this->_data); - } - - /** - * Increases the position - * For Iterator interface - * - * @return void - */ - public function next() { - next($this->_data); - } - - /** - * isset using the ArrayAccess interface - * - * @param number - * @return bool - */ - public function offsetExists($offset) { - return isset($this->_data[$offset]); - } - - /** - * returns data using the ArrayAccess interface - * - * @param number - * @return bool - */ - public function offsetGet($offset) { - return isset($this->_data[$offset]) ? $this->_data[$offset] : NULL; - } - - /** - * Sets data using the ArrayAccess interface - * - * @param number - * @param mixed - * @return void - */ - public function offsetSet($offset, $value) { - if (is_null($offset)) { - $this->_data[] = $value; - } else { - $this->_data[$offset] = $value; - } - } - - /** - * unsets using the ArrayAccess interface - * - * @param number - * @return bool - */ - public function offsetUnset($offset) { - unset($this->_data[$offset]); - } - - /** - * Inserts a row in an array after the given index and adjusts all the indexes - * - * @param *scalar the key we are looking for to past after - * @param *mixed the value to paste - * @param scalar the key to paste along with the value - * @return this - */ - public function paste($after, $value, $key = NULL) { - //Argument test - Eden_Type_Error::i() - ->argument(1, 'scalar') //Argument 1 must be a scalar - ->argument(3, 'scalar', 'null'); //Argument 3 must be a scalar or null - - $list = array(); - //for each row - foreach($this->_data as $i => $val) { - //add this row back to the list - $list[$i] = $val; - - //if this is not the key we are - //suppose to paste after - if($after != $i) { - //do nothing more - continue; - } - - //if there was a key involved - if(!is_null($key)) { - //lets add the new value - $list[$key] = $value; - continue; - } - - //lets add the new value - $list[] = $arrayValue; - } - - //if there was no key involved - if(is_null($key)) { - //reindex the array - $list = array_values($list); - } - - //give it back - $this->_data = $list; - - return $this; - } - - /** - * Rewinds the position - * For Iterator interface - * - * @return void - */ - public function rewind() { - reset($this->_data); - } - - /** - * returns serialized data using the Serializable interface - * - * @return string - */ - public function serialize() { - return json_encode($this->_data); - } - - /** - * Sets data - * - * @return this - */ - public function set($value) { - Eden_Type_Error::i()->argument(1, 'array'); - $this->_data = $value; - return $this; - } - - /** - * sets data using the Serializable interface - * - * @param string - * @return void - */ - public function unserialize($data) { - $this->_data = json_decode($data, true); - return $this; - } - - /** - * Validates whether if the index is set - * For Iterator interface - * - * @return void - */ - public function valid() { - return isset($this->_data[$this->key()]); - } - - /* Protected Methods - -------------------------------*/ - protected function _getMethodType(&$name) { - - if(isset(self::$_methods[$name])) { - return self::$_methods[$name]; - } - - if(isset(self::$_methods['array_'.$name])) { - $name = 'array_'.$name; - return self::$_methods[$name]; - } - - $uncamel = strtolower(preg_replace("/([A-Z])/", "_$1", $name)); - - if(isset(self::$_methods[$uncamel])) { - $name = $uncamel; - return self::$_methods[$name]; - } - - if(isset(self::$_methods['array_'.$uncamel])) { - $name = 'array_'.$uncamel; - return self::$_methods[$name]; - } - - return false; - } - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Array object + * + * @package Eden + * @category core + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Type_Array extends Eden_Type_Abstract implements ArrayAccess, Iterator, Serializable, Countable { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_data = array(); + protected $_original = array(); + + protected static $_methods = array( + 'array_change_key_case' => self::PRE, 'array_chunk' => self::PRE, + 'array_combine' => self::PRE, 'array_count_datas' => self::PRE, + 'array_diff_assoc' => self::PRE, 'array_diff_key' => self::PRE, + 'array_diff_uassoc' => self::PRE, 'array_diff_ukey' => self::PRE, + 'array_diff' => self::PRE, 'array_fill_keys' => self::PRE, + 'array_filter' => self::PRE, 'array_flip' => self::PRE, + 'array_intersect_assoc' => self::PRE, 'array_intersect_key' => self::PRE, + 'array_intersect_uassoc' => self::PRE, 'array_intersect_ukey' => self::PRE, + 'array_intersect' => self::PRE, 'array_keys' => self::PRE, + 'array_merge_recursive' => self::PRE, 'array_merge' => self::PRE, + 'array_pad' => self::PRE, + 'array_reverse' => self::PRE, 'array_shift' => self::PRE, + 'array_slice' => self::PRE, 'array_splice' => self::PRE, + 'array_sum' => self::PRE, 'array_udiff_assoc' => self::PRE, + 'array_udiff_uassoc' => self::PRE, 'array_udiff' => self::PRE, + 'array_uintersect_assoc' => self::PRE, 'array_uintersect_uassoc' => self::PRE, + 'array_uintersect' => self::PRE, 'array_unique' => self::PRE, + 'array_datas' => self::PRE, 'count' => self::PRE, + 'current' => self::PRE, 'each' => self::PRE, + 'end' => self::PRE, 'extract' => self::PRE, + 'key' => self::PRE, 'next' => self::PRE, + 'prev' => self::PRE, 'sizeof' => self::PRE, + + 'array_fill' => self::POST, 'array_map' => self::POST, + 'array_search' => self::POST, 'compact' => self::POST, + 'implode' => self::POST, 'in_array' => self::POST, + + 'array_unshift' => self::REFERENCE, 'array_walk_recursive' => self::REFERENCE, + 'array_walk' => self::REFERENCE, 'arsort' => self::REFERENCE, + 'asort' => self::REFERENCE, 'krsort' => self::REFERENCE, + 'ksort' => self::REFERENCE, 'natcasesort' => self::REFERENCE, + 'natsort' => self::REFERENCE, 'reset' => self::REFERENCE, + 'rsort' => self::REFERENCE, 'shuffle' => self::REFERENCE, + 'sort' => self::REFERENCE, 'uasort' => self::REFERENCE, + 'uksort' => self::REFERENCE, 'usort' => self::REFERENCE, + 'array_push' => self::REFERENCE); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __call($name, $args) { + //if the method starts with get + if(strpos($name, 'get') === 0) { + //getUserName('-') + $separator = '_'; + if(isset($args[0]) && is_scalar($args[0])) { + $separator = (string) $args[0]; + } + + $key = preg_replace("/([A-Z0-9])/", $separator."$1", $name); + //get rid of get + $key = strtolower(substr($key, 3+strlen($separator))); + + if(isset($this->_data[$key])) { + return $this->_data[$key]; + } + + return NULL; + + } else if (strpos($name, 'set') === 0) { + //setUserName('Chris', '-') + $separator = '_'; + if(isset($args[1]) && is_scalar($args[1])) { + $separator = (string) $args[1]; + } + + $key = preg_replace("/([A-Z0-9])/", $separator."$1", $name); + + //get rid of set + $key = strtolower(substr($key, 3+strlen($separator))); + + $this->__set($key, isset($args[0]) ? $args[0] : NULL); + + return $this; + } + + try { + return parent::__call($name, $args); + } catch(Eden_Error $e) { + Eden_Type_Error::i($e->getMessage())->trigger(); + } + } + + public function __construct($data = array()) { + //if there is more arguments or data is not an array + if(func_num_args() > 1 || !is_array($data)) { + //just get the args + $data = func_get_args(); + } + + parent::__construct($data); + } + + public function __set($name, $value) { + $this->_data[$name] = $value; + } + + public function __toString() { + return json_encode($this->get()); + } + + /* Public Methods + -------------------------------*/ + /** + * Copies the value of source key into destination key + * + * @param string + * @param string + */ + public function copy($source, $destination) { + $this->_data[$destination] = $this->_data[$source]; + return $this; + } + + /** + * returns size using the Countable interface + * + * @return string + */ + public function count() { + return count($this->_data); + } + + /** + * Removes a row in an array and adjusts all the indexes + * + * @param *string the key to leave out + * @return this + */ + public function cut($key) { + //argument 1 must be scalar + Eden_Type_Error::i()->argument(1, 'scalar'); + + //if nothing to cut + if(!isset($this->_data[$key])) { + //do nothing + return $this; + } + + //unset the value + unset($this->_data[$key]); + //reindex the list + $this->_data = array_values($this->_data); + return $this; + } + + /** + * Returns the current item + * For Iterator interface + * + * @return void + */ + public function current() { + return current($this->_data); + } + + /** + * Loops through returned result sets + * + * @param *callable + * @return this + */ + public function each($callback) { + Eden_Error::i()->argument(1, 'callable'); + + foreach($this->_data as $key => $value) { + call_user_func($callback, $key, $value); + } + + return $this; + } + + /** + * Returns if the data is empty + * + * @return bool + */ + public function isEmpty() { + return empty($this->_data); + } + + /** + * Returns th current position + * For Iterator interface + * + * @return void + */ + public function key() { + return key($this->_data); + } + + /** + * Increases the position + * For Iterator interface + * + * @return void + */ + public function next() { + next($this->_data); + } + + /** + * isset using the ArrayAccess interface + * + * @param number + * @return bool + */ + public function offsetExists($offset) { + return isset($this->_data[$offset]); + } + + /** + * returns data using the ArrayAccess interface + * + * @param number + * @return bool + */ + public function offsetGet($offset) { + return isset($this->_data[$offset]) ? $this->_data[$offset] : NULL; + } + + /** + * Sets data using the ArrayAccess interface + * + * @param number + * @param mixed + * @return void + */ + public function offsetSet($offset, $value) { + if (is_null($offset)) { + $this->_data[] = $value; + } else { + $this->_data[$offset] = $value; + } + } + + /** + * unsets using the ArrayAccess interface + * + * @param number + * @return bool + */ + public function offsetUnset($offset) { + unset($this->_data[$offset]); + } + + /** + * Inserts a row in an array after the given index and adjusts all the indexes + * + * @param *scalar the key we are looking for to past after + * @param *mixed the value to paste + * @param scalar the key to paste along with the value + * @return this + */ + public function paste($after, $value, $key = NULL) { + //Argument test + Eden_Type_Error::i() + ->argument(1, 'scalar') //Argument 1 must be a scalar + ->argument(3, 'scalar', 'null'); //Argument 3 must be a scalar or null + + $list = array(); + //for each row + foreach($this->_data as $i => $val) { + //add this row back to the list + $list[$i] = $val; + + //if this is not the key we are + //suppose to paste after + if($after != $i) { + //do nothing more + continue; + } + + //if there was a key involved + if(!is_null($key)) { + //lets add the new value + $list[$key] = $value; + continue; + } + + //lets add the new value + $list[] = $arrayValue; + } + + //if there was no key involved + if(is_null($key)) { + //reindex the array + $list = array_values($list); + } + + //give it back + $this->_data = $list; + + return $this; + } + + /** + * Rewinds the position + * For Iterator interface + * + * @return void + */ + public function rewind() { + reset($this->_data); + } + + /** + * returns serialized data using the Serializable interface + * + * @return string + */ + public function serialize() { + return json_encode($this->_data); + } + + /** + * Sets data + * + * @return this + */ + public function set($value) { + Eden_Type_Error::i()->argument(1, 'array'); + $this->_data = $value; + return $this; + } + + /** + * sets data using the Serializable interface + * + * @param string + * @return void + */ + public function unserialize($data) { + $this->_data = json_decode($data, true); + return $this; + } + + /** + * Validates whether if the index is set + * For Iterator interface + * + * @return void + */ + public function valid() { + return isset($this->_data[$this->key()]); + } + + /* Protected Methods + -------------------------------*/ + protected function _getMethodType(&$name) { + + if(isset(self::$_methods[$name])) { + return self::$_methods[$name]; + } + + if(isset(self::$_methods['array_'.$name])) { + $name = 'array_'.$name; + return self::$_methods[$name]; + } + + $uncamel = strtolower(preg_replace("/([A-Z])/", "_$1", $name)); + + if(isset(self::$_methods[$uncamel])) { + $name = $uncamel; + return self::$_methods[$name]; + } + + if(isset(self::$_methods['array_'.$uncamel])) { + $name = 'array_'.$uncamel; + return self::$_methods[$name]; + } + + return false; + } + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/type/error.php b/library/eden/type/error.php index e2fcbc1..a4a599f 100755 --- a/library/eden/type/error.php +++ b/library/eden/type/error.php @@ -1,39 +1,39 @@ - -/* - * This file is part of the Eden package. - * (c) 2010-2012 Christian Blanquera - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Type Errors - * - * @package Eden - * @category core - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Type_Error extends Eden_Error { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i($message = NULL, $code = 0) { - $class = __CLASS__; - return new $class($message, $code); - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2010-2012 Christian Blanquera + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Type Errors + * + * @package Eden + * @category core + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Type_Error extends Eden_Error { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i($message = NULL, $code = 0) { + $class = __CLASS__; + return new $class($message, $code); + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/type/string.php b/library/eden/type/string.php index 79ca1b5..9781b55 100644 --- a/library/eden/type/string.php +++ b/library/eden/type/string.php @@ -1,185 +1,185 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * String Object - * - * @package Eden - * @category core - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Type_String extends Eden_Type_Abstract { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected static $_methods = array( - 'addslashes' => self::PRE, - 'bin2hex' => self::PRE, 'chunk_split' => self::PRE, - 'convert_uudecode' => self::PRE, 'convert_uuencode' => self::PRE, - 'crypt' => self::PRE, 'html_entity_decode' => self::PRE, - 'htmlentities' => self::PRE, 'htmlspecialchars_decode' => self::PRE, - 'htmlspecialchars' => self::PRE, 'lcfirst' => self::PRE, - 'ltrim' => self::PRE, 'md5' => self::PRE, - 'nl2br' => self::PRE, 'quoted_printable_decode' => self::PRE, - 'quoted_printable_encode' => self::PRE, 'quotemeta' => self::PRE, - 'rtrim' => self::PRE, 'sha1' => self::PRE, - 'sprintf' => self::PRE, 'str_pad' => self::PRE, - 'str_repeat' => self::PRE, 'str_rot13' => self::PRE, - 'str_shuffle' => self::PRE, 'strip_tags' => self::PRE, - 'stripcslashes' => self::PRE, 'stripslashes' => self::PRE, - 'strpbrk' => self::PRE, 'stristr' => self::PRE, - 'strrev' => self::PRE, 'strstr' => self::PRE, - 'strtok' => self::PRE, 'strtolower' => self::PRE, - 'strtoupper' => self::PRE, 'strtr' => self::PRE, - 'substr_replace' => self::PRE, 'substr' => self::PRE, - 'trim' => self::PRE, 'ucfirst' => self::PRE, - 'ucwords' => self::PRE, 'vsprintf' => self::PRE, - 'wordwrap' => self::PRE, 'count_chars' => self::PRE, - 'hex2bin' => self::PRE, 'strlen' => self::PRE, - 'strpos' => self::PRE, 'substr_compare' => self::PRE, - 'substr_count' => self::PRE, - - 'str_ireplace' => self::POST, 'str_replace' => self::POST, - 'preg_replace' => self::POST, 'explode' => self::POST); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($data) { - //argument 1 must be scalar - Eden_Type_Error::i()->argument(1, 'scalar'); - $data = (string) $data; - - parent::__construct($data); - } - - public function __toString() { - return $this->_data; - } - - /* Public Methods - -------------------------------*/ - /** - * Camelizes a string - * - * @param string prefix - * @return this - */ - public function camelize($prefix = '-') { - //argument 1 must be a string - Eden_Type_Error::i()->argument(1, 'string'); - - $this->_data = str_replace($prefix, ' ', $this->_data); - $this->_data = str_replace(' ', '', ucwords($this->_data)); - - $this->_data = strtolower(substr($name, 0, 1)).substr($name, 1); - - return $this; - } - - /** - * Transforms a string with caps and - * space to a lower case dash string - * - * @return this - */ - public function dasherize() { - $this->_data = preg_replace("/[^a-zA-Z0-9_-\s]/i", '', $this->_data); - $this->_data = str_replace(' ', '-', trim($this->_data)); - $this->_data = preg_replace("/-+/i", '-', $this->_data); - $this->_data = strtolower($this->_data); - - return $this; - } - - /** - * Titlizes a string - * - * @param string prefix - * @return this - */ - public function titlize($prefix = '-') { - //argument 1 must be a string - Eden_Type_Error::i()->argument(1, 'string'); - - $this->_data = ucwords(str_replace($prefix, ' ', $this->_data)); - - return $this; - } - - /** - * Uncamelizes a string - * - * @param string prefix - * @return this - */ - public function uncamelize($prefix = '-') { - //argument 1 must be a string - Eden_Type_Error::i()->argument(1, 'string'); - - $this->_data = strtolower(preg_replace("/([A-Z])/", $prefix."$1", $this->_data)); - - return $this; - } - - /** - * Summarizes a text - * - * @param int number of words - * @return this - */ - public function summarize($words) { - //argument 1 must be a string - Eden_Type_Error::i()->argument(1, 'int'); - - $this->_data = explode(' ', strip_tags($this->_data), $words); - array_pop($this->_data); - $this->_data = implode(' ', $this->_data); - - return $this; - } - - /* Protected Methods - -------------------------------*/ - protected function _getMethodType(&$name) { - if(isset(self::$_methods[$name])) { - return self::$_methods[$name]; - } - - if(isset(self::$_methods['str_'.$name])) { - $name = 'str_'.$name; - return self::$_methods[$name]; - } - - $uncamel = strtolower(preg_replace("/([A-Z])/", "_$1", $name)); - - if(isset(self::$_methods[$uncamel])) { - $name = $uncamel; - return self::$_methods[$name]; - } - - if(isset(self::$_methods['str_'.$uncamel])) { - $name = 'str_'.$uncamel; - return self::$_methods[$name]; - } - - return false; - } - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * String Object + * + * @package Eden + * @category core + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Type_String extends Eden_Type_Abstract { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected static $_methods = array( + 'addslashes' => self::PRE, + 'bin2hex' => self::PRE, 'chunk_split' => self::PRE, + 'convert_uudecode' => self::PRE, 'convert_uuencode' => self::PRE, + 'crypt' => self::PRE, 'html_entity_decode' => self::PRE, + 'htmlentities' => self::PRE, 'htmlspecialchars_decode' => self::PRE, + 'htmlspecialchars' => self::PRE, 'lcfirst' => self::PRE, + 'ltrim' => self::PRE, 'md5' => self::PRE, + 'nl2br' => self::PRE, 'quoted_printable_decode' => self::PRE, + 'quoted_printable_encode' => self::PRE, 'quotemeta' => self::PRE, + 'rtrim' => self::PRE, 'sha1' => self::PRE, + 'sprintf' => self::PRE, 'str_pad' => self::PRE, + 'str_repeat' => self::PRE, 'str_rot13' => self::PRE, + 'str_shuffle' => self::PRE, 'strip_tags' => self::PRE, + 'stripcslashes' => self::PRE, 'stripslashes' => self::PRE, + 'strpbrk' => self::PRE, 'stristr' => self::PRE, + 'strrev' => self::PRE, 'strstr' => self::PRE, + 'strtok' => self::PRE, 'strtolower' => self::PRE, + 'strtoupper' => self::PRE, 'strtr' => self::PRE, + 'substr_replace' => self::PRE, 'substr' => self::PRE, + 'trim' => self::PRE, 'ucfirst' => self::PRE, + 'ucwords' => self::PRE, 'vsprintf' => self::PRE, + 'wordwrap' => self::PRE, 'count_chars' => self::PRE, + 'hex2bin' => self::PRE, 'strlen' => self::PRE, + 'strpos' => self::PRE, 'substr_compare' => self::PRE, + 'substr_count' => self::PRE, + + 'str_ireplace' => self::POST, 'str_replace' => self::POST, + 'preg_replace' => self::POST, 'explode' => self::POST); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($data) { + //argument 1 must be scalar + Eden_Type_Error::i()->argument(1, 'scalar'); + $data = (string) $data; + + parent::__construct($data); + } + + public function __toString() { + return $this->_data; + } + + /* Public Methods + -------------------------------*/ + /** + * Camelizes a string + * + * @param string prefix + * @return this + */ + public function camelize($prefix = '-') { + //argument 1 must be a string + Eden_Type_Error::i()->argument(1, 'string'); + + $this->_data = str_replace($prefix, ' ', $this->_data); + $this->_data = str_replace(' ', '', ucwords($this->_data)); + + $this->_data = strtolower(substr($name, 0, 1)).substr($name, 1); + + return $this; + } + + /** + * Transforms a string with caps and + * space to a lower case dash string + * + * @return this + */ + public function dasherize() { + $this->_data = preg_replace("/[^a-zA-Z0-9_-\s]/i", '', $this->_data); + $this->_data = str_replace(' ', '-', trim($this->_data)); + $this->_data = preg_replace("/-+/i", '-', $this->_data); + $this->_data = strtolower($this->_data); + + return $this; + } + + /** + * Titlizes a string + * + * @param string prefix + * @return this + */ + public function titlize($prefix = '-') { + //argument 1 must be a string + Eden_Type_Error::i()->argument(1, 'string'); + + $this->_data = ucwords(str_replace($prefix, ' ', $this->_data)); + + return $this; + } + + /** + * Uncamelizes a string + * + * @param string prefix + * @return this + */ + public function uncamelize($prefix = '-') { + //argument 1 must be a string + Eden_Type_Error::i()->argument(1, 'string'); + + $this->_data = strtolower(preg_replace("/([A-Z])/", $prefix."$1", $this->_data)); + + return $this; + } + + /** + * Summarizes a text + * + * @param int number of words + * @return this + */ + public function summarize($words) { + //argument 1 must be a string + Eden_Type_Error::i()->argument(1, 'int'); + + $this->_data = explode(' ', strip_tags($this->_data), $words); + array_pop($this->_data); + $this->_data = implode(' ', $this->_data); + + return $this; + } + + /* Protected Methods + -------------------------------*/ + protected function _getMethodType(&$name) { + if(isset(self::$_methods[$name])) { + return self::$_methods[$name]; + } + + if(isset(self::$_methods['str_'.$name])) { + $name = 'str_'.$name; + return self::$_methods[$name]; + } + + $uncamel = strtolower(preg_replace("/([A-Z])/", "_$1", $name)); + + if(isset(self::$_methods[$uncamel])) { + $name = $uncamel; + return self::$_methods[$name]; + } + + if(isset(self::$_methods['str_'.$uncamel])) { + $name = 'str_'.$uncamel; + return self::$_methods[$name]; + } + + return false; + } + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/validation.php b/library/eden/validation.php index 2512462..d1c7905 100644 --- a/library/eden/validation.php +++ b/library/eden/validation.php @@ -1,180 +1,180 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/class.php'; - -/** - * Validation - * - * @package Eden - * @category core - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Validation extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_value = NULL; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($value) { - $this->_value = $value; - } - - /* Public Methods - -------------------------------*/ - public function isType($type) { - switch($type) { - case 'number': - return is_numeric($this->_value); - case 'integer': - case 'int': - return is_numeric($this->_value) && strpos((string) $this->_value, '.') === false; - case 'float': - return is_numeric($this->_value) && strpos((string) $this->_value, '.') !== false; - case 'file': - return is_string($this->_value) && file_exists($this->_value); - case 'folder': - return is_string($this->_value) && is_dir($this->_value); - case 'email': - return is_string($this->_value) && $this->_isEmail($this->_value); - case 'url': - return is_string($this->_value) && $this->_isUrl($this->_value); - case 'html': - return is_string($this->_value) && $this->_isHtml($this->_value); - case 'creditcard': - case 'cc': - return (is_string($this->_value) || is_int($this->_value)) && $this->_isCreditCard($this->_value); - case 'hex': - return is_string($this->_value) && $this->_isHex($this->_value); - case 'slug': - case 'shortname': - case 'short': - return !preg_match("/[^a-z0-9_]/i", $this->_value); - default: break; - } - - $method = 'is_'.$type; - if(function_exists($method)) { - return $method($data); - } - - if(class_exists($type)) { - return $data instanceof $type; - } - - return true; - } - - /* Public Number Methods - -------------------------------*/ - public function greaterThan($number) { - return $this->_value > (float)$number; - } - - public function greaterThanEqualTo($number) { - return $this->_value >= (float)$number; - } - - public function lessThan($number) { - return $this->_value < (float)$number; - } - - public function lessThanEqualTo($number) { - return $this->_value <= (float)$number; - } - - /* Public String Methods - -------------------------------*/ - public function lengthGreaterThan($number) { - return strlen((string)$this->_value) > (float)$number; - } - - public function lengthGreaterThanEqualTo($number) { - return strlen((string)$this->_value) >= (float)$number; - } - - public function lengthLessThan($number) { - return strlen((string)$this->_value) < (float)$number; - } - - public function lengthLessThanEqualTo($number) { - return strlen((string)$this->_value) <= (float)$number; - } - - public function notEmpty() { - return !empty($this->_value); - } - - public function startsWithLetter() { - return !preg_match("/^[a-zA-Z]/i", $this->_value); - } - - public function alphaNumeric() { - return preg_match('/^[a-zA-Z0-9]+$/', (string) $this->_value); - } - - public function alphaNumericUnderScore() { - return preg_match('/^[a-zA-Z0-9_]+$/', (string) $this->_value); - } - - public function alphaNumericHyphen() { - return preg_match('/^[a-zA-Z0-9-]+$/', (string) $this->_value); - } - - public function alphaNumericLine() { - return preg_match('/^[a-zA-Z0-9-_]+$/', (string) $this->_value); - } - - /* Protected Methods - -------------------------------*/ - protected function _isCreditCard($value) { - return preg_match('/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]'. - '{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-'. - '5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/', $value); - } - - protected function _isEmail($value) { - return preg_match('/^(?:(?:(?:[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]|\x5c(?=[@,"\[\]'. - '\x5c\x00-\x20\x7f-\xff]))(?:[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]|(?<=\x5c)[@,"\[\]'. - '\x5c\x00-\x20\x7f-\xff]|\x5c(?=[@,"\[\]\x5c\x00-\x20\x7f-\xff])|\.(?=[^\.])){1,62'. - '}(?:[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]|(?<=\x5c)[@,"\[\]\x5c\x00-\x20\x7f-\xff])|'. - '[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]{1,2})|"(?:[^"]|(?<=\x5c)"){1,62}")@(?:(?!.{64})'. - '(?:[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.?|[a-zA-Z0-9]\.?)+\.(?:xn--[a-zA-Z0-9]'. - '+|[a-zA-Z]{2,6})|\[(?:[0-1]?\d?\d|2[0-4]\d|25[0-5])(?:\.(?:[0-1]?\d?\d|2[0-4]\d|25'. - '[0-5])){3}\])$/', $value); - } - - protected function _isHtml($value) { - return preg_match("/<\/?\w+((\s+(\w|\w[\w-]*\w)(\s*=\s*". - "(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i", $value); - } - - protected function _isUrl($value) { - return preg_match('/^(http|https|ftp):\/\/([A-Z0-9][A-Z0'. - '-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?\/?/i', $value); - } - - protected function _isHex($value) { - return preg_match("/^[0-9a-fA-F]{6}$/", $value); - } - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/class.php'; + +/** + * Validation + * + * @package Eden + * @category core + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Validation extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_value = NULL; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($value) { + $this->_value = $value; + } + + /* Public Methods + -------------------------------*/ + public function isType($type) { + switch($type) { + case 'number': + return is_numeric($this->_value); + case 'integer': + case 'int': + return is_numeric($this->_value) && strpos((string) $this->_value, '.') === false; + case 'float': + return is_numeric($this->_value) && strpos((string) $this->_value, '.') !== false; + case 'file': + return is_string($this->_value) && file_exists($this->_value); + case 'folder': + return is_string($this->_value) && is_dir($this->_value); + case 'email': + return is_string($this->_value) && $this->_isEmail($this->_value); + case 'url': + return is_string($this->_value) && $this->_isUrl($this->_value); + case 'html': + return is_string($this->_value) && $this->_isHtml($this->_value); + case 'creditcard': + case 'cc': + return (is_string($this->_value) || is_int($this->_value)) && $this->_isCreditCard($this->_value); + case 'hex': + return is_string($this->_value) && $this->_isHex($this->_value); + case 'slug': + case 'shortname': + case 'short': + return !preg_match("/[^a-z0-9_]/i", $this->_value); + default: break; + } + + $method = 'is_'.$type; + if(function_exists($method)) { + return $method($data); + } + + if(class_exists($type)) { + return $data instanceof $type; + } + + return true; + } + + /* Public Number Methods + -------------------------------*/ + public function greaterThan($number) { + return $this->_value > (float)$number; + } + + public function greaterThanEqualTo($number) { + return $this->_value >= (float)$number; + } + + public function lessThan($number) { + return $this->_value < (float)$number; + } + + public function lessThanEqualTo($number) { + return $this->_value <= (float)$number; + } + + /* Public String Methods + -------------------------------*/ + public function lengthGreaterThan($number) { + return strlen((string)$this->_value) > (float)$number; + } + + public function lengthGreaterThanEqualTo($number) { + return strlen((string)$this->_value) >= (float)$number; + } + + public function lengthLessThan($number) { + return strlen((string)$this->_value) < (float)$number; + } + + public function lengthLessThanEqualTo($number) { + return strlen((string)$this->_value) <= (float)$number; + } + + public function notEmpty() { + return !empty($this->_value); + } + + public function startsWithLetter() { + return !preg_match("/^[a-zA-Z]/i", $this->_value); + } + + public function alphaNumeric() { + return preg_match('/^[a-zA-Z0-9]+$/', (string) $this->_value); + } + + public function alphaNumericUnderScore() { + return preg_match('/^[a-zA-Z0-9_]+$/', (string) $this->_value); + } + + public function alphaNumericHyphen() { + return preg_match('/^[a-zA-Z0-9-]+$/', (string) $this->_value); + } + + public function alphaNumericLine() { + return preg_match('/^[a-zA-Z0-9-_]+$/', (string) $this->_value); + } + + /* Protected Methods + -------------------------------*/ + protected function _isCreditCard($value) { + return preg_match('/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]'. + '{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-'. + '5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/', $value); + } + + protected function _isEmail($value) { + return preg_match('/^(?:(?:(?:[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]|\x5c(?=[@,"\[\]'. + '\x5c\x00-\x20\x7f-\xff]))(?:[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]|(?<=\x5c)[@,"\[\]'. + '\x5c\x00-\x20\x7f-\xff]|\x5c(?=[@,"\[\]\x5c\x00-\x20\x7f-\xff])|\.(?=[^\.])){1,62'. + '}(?:[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]|(?<=\x5c)[@,"\[\]\x5c\x00-\x20\x7f-\xff])|'. + '[^@,"\[\]\x5c\x00-\x20\x7f-\xff\.]{1,2})|"(?:[^"]|(?<=\x5c)"){1,62}")@(?:(?!.{64})'. + '(?:[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.?|[a-zA-Z0-9]\.?)+\.(?:xn--[a-zA-Z0-9]'. + '+|[a-zA-Z]{2,6})|\[(?:[0-1]?\d?\d|2[0-4]\d|25[0-5])(?:\.(?:[0-1]?\d?\d|2[0-4]\d|25'. + '[0-5])){3}\])$/', $value); + } + + protected function _isHtml($value) { + return preg_match("/<\/?\w+((\s+(\w|\w[\w-]*\w)(\s*=\s*". + "(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i", $value); + } + + protected function _isUrl($value) { + return preg_match('/^(http|https|ftp):\/\/([A-Z0-9][A-Z0'. + '-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?\/?/i', $value); + } + + protected function _isHex($value) { + return preg_match("/^[0-9a-fA-F]{6}$/", $value); + } + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/webcharge.php b/library/eden/webcharge.php index 38025df..9b2fb19 100644 --- a/library/eden/webcharge.php +++ b/library/eden/webcharge.php @@ -1,255 +1,255 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/curl.php'; - -/** - * Intuit Innovative Gateway Solution WebCharge application - * model for payment processing. - * - * @package Eden - * @category webcharge - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Webcharge_Model extends Eden_Class -{ - /* Constants - -------------------------------*/ - const PAYMENT_URL = 'https://transactions.innovativegateway.com/servlet/com.gateway.aai.Aai'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_user = NULL; - protected $_agent = 'Mozilla/4.0'; - protected $_password = NULL; - protected $_proxy = NULL; - protected $_timeout = 120; - protected $_error = NULL; - - protected $_template = array( - //merchant authentication - 'username' => NULL, - 'pw' => NULL, - //payment mode - 'test_override_errors' => 'true', - //transaction information - 'response_mode' => 'simple', - 'response_fmt' => 'delimited', - 'upg_auth' => 'zxcvlkjh', - 'fulltotal' => NULL, // Total amount WITHOUT dollar sign. - 'authamount' => '', // Only valid for POSTAUTH and is equal to the original preauth amount. - 'trantype' => 'sale', // Options: preauth, postauth, sale, credit, void - 'reference' => '', // Blank for new sales; required for VOID, POSTAUTH, and CREDITS; Will be original Approval value. - 'trans_id' => '', // Blank for new sales; required for VOID, POSTAUTH, and CREDITS; Will be original ANATRANSID value. - //credit card information - 'cardtype' => NULL, // Options visa, mc, amex, diners, discover, jcb - 'ccnumber' => NULL, // CC# may include spaces or dashes. - 'month' => NULL, // Must be TWO DIGIT month. - 'year' => NULL, // Must be TWO or FOUR DIGIT year. - 'ccname' => NULL, - //customer information - 'baddress' => NULL, - 'baddress1' => NULL, - 'bcity' => NULL, - 'bstate' => NULL, - 'bcountry' => 'US', // TWO DIGIT COUNTRY (United States = "US") - 'zip' => NULL, - 'phone' => NULL, - 'email' => NULL, - //things that do not usually change - 'target_app' => 'WebEden_Chargev5.06', - 'delimited_fmt_field_delimiter' => '=', - 'delimited_fmt_include_fields' => 'true', - 'delimited_fmt_value_delimiter' => '|'); - - protected $_creditCards = array('visa', 'mc', 'amex', 'diners', 'discover', 'jcb'); - protected $_transactionTypes = array('preauth', 'postauth', 'sale', 'credit', 'void'); - - protected $_transaction = array(); - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - public function __construct($user = NULL, $password = NULL, array $options = array()) { - $this->setUser($user)->setPassword($password); - - $this->_proxy = isset($options['proxy']) ? $options['proxy'] : NULL; - $this->_agent = isset($options['agent']) ? $options['agent'] : 'Mozilla/4.0'; - $this->_timeout = isset($options['timeout']) ? $options['timeout'] : 120; - } - - /* Public Methods - -------------------------------*/ - /** - * Validates required transaction parameters and sends - * the transaction to Innovative Gateway Solutions. - * - * @return string the cURL result - */ - public function send() { - //test for valid amount - if(!$this->_transaction['fulltotal'] || !is_numeric($this->_transaction['fulltotal'])) { - //throw exception - Eden_Webcharge_Error::i() - ->setMessage(Eden_Webcharge_Error::INVALID_AMOUNT) - ->addVariable((string) $this->_transaction['fulltotal']); - } - - //test for valid transaction type - if(!$this->_transaction['trantype'] || !in_array($this->_transaction['trantype'], $this->_transactionTypes)) { - //throw exception - Eden_Webcharge_Error::i() - ->setMessage(Eden_Webcharge_Error::INVALID_TRANSACTION_TYPE) - ->addVariable((string) $this->_transaction['trantype']) - ->trigger(); - } - - //test for valid card type - if(!$this->_transaction['cardtype'] || !in_array($this->_transaction['cardtype'], $this->creditCards)) { - //throw exception - Eden_Webcharge_Error::i() - ->setMessage(Eden_Webcharge_Error::INVALID_CARD_TYPE) - ->addVariable((string) $this->_transaction['cardtype']) - ->trigger(); - } - - //test for valid month - if(!$this->_transaction['month'] || !is_numeric($this->_transaction['month']) || strlen((string) $this->_transaction['month']) != 2) { - //throw exception - Eden_Webcharge_Error::i() - ->setMessage(Eden_Webcharge_Error::INVALID_CREDIT_CARD_MONTH) - ->addVariable((string) $this->_transaction['month']) - ->trigger(); - } - - //test for valid year - if(!$this->_transaction['year'] || !is_numeric($this->_transaction['year']) || !in_array(strlen((string) $this->_transaction['year']), array(2, 4))) { - //throw exception - Eden_Webcharge_Error::i() - ->setMessage(Eden_Webcharge_Error::INVALID_CREDIT_CARD_YEAR) - ->addVariable((string) $this->_transaction['year']) - ->trigger(); - } - - //test for valid creditcard name - if(!$this->_transaction['ccname']) { - //throw exception - Eden_Webcharge_Error::i(Eden_Webcharge_Error::INVALID_CREDIT_CARD_NAME)->trigger(); - } - - // Create the connection through the cURL extension - return Eden_Curl::i() - ->setUrl(self::PAYMENT_URL) - ->when($this->_proxy != NULL) - ->setProxy($this->_proxy) - ->endWhen() - ->setUserAgent($this->_agent) - ->setPost(true) - ->setPostFields($this->_transaction) - ->setFollowLocation(true) - ->setTimeout($this->_timeout) - ->getResponse(); - } - - /** - * Sets the merchant password - * - * @param string password - * @return this - */ - public function setPassword($password) { - Eden_Webcharge_Error::i() - ->setMessage()->argument(1, 'string'); - $this->_transaction['pw'] = $password; - return $this; - } - - /** - * Set a transaction to send. - * - * @param array the transaction to set - * @return string the cURL result - */ - public function setTransaction(array $transaction) { - //we loop through the template because - //these are the keys WebCharge will take - //and we do not want to add any extra variables - //when we query their server - foreach($this->_template as $key => $value) { - //if the passed in transaction - if(isset($transaction[$key])) { - //allow this transaction to be set by it - $this->_transaction[$key] = $transaction[$key]; - //else if it is not set in this transaction - } else if(!isset($this->_transaction[$key])) { - //set it using the template's value - $this->_transaction[$key] = $value; - } - } - - return $this; - } - - /** - * Sets the Merchant user name - * - * @param string user name - * @return this - */ - public function setUser($user) { - Eden_Webcharge_Error::i() - ->setMessage()->argument(1, 'string'); - $this->_transaction['username'] = $user; - return $this; - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ -} - -/** - * WebCharge exception - */ -class Eden_Webcharge_Error extends Eden_Error -{ - /* Constants - -------------------------------*/ - const INVALID_AMOUNT = 'The amount set in the transaction (fulltotal) must be a number. %s was given.'; - const INVALID_TRANSACTION_TYPE = 'The transaction type (trantype) is invalid. "preauth", "postauth", "sale", "credit", "void" are allowed. %s was given.'; - const INVALID_CARD_TYPE = 'The credit card type (cardtype) is invalid. "visa", "mc", "amex", "diners", "discover", "jcb" are allowed. %s was given.'; - const INVALID_CREDIT_CARD_MONTH = 'The credit card month (month) must be a 2 digit number. %s was given.'; - const INVALID_CREDIT_CARD_YEAR = 'The credit card year (year) must be a 2 or 4 digit number. %s was given.'; - const INVALID_CREDIT_CARD_NAME = 'The credit card name cannot be empty.'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/curl.php'; + +/** + * Intuit Innovative Gateway Solution WebCharge application + * model for payment processing. + * + * @package Eden + * @category webcharge + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Webcharge_Model extends Eden_Class +{ + /* Constants + -------------------------------*/ + const PAYMENT_URL = 'https://transactions.innovativegateway.com/servlet/com.gateway.aai.Aai'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_user = NULL; + protected $_agent = 'Mozilla/4.0'; + protected $_password = NULL; + protected $_proxy = NULL; + protected $_timeout = 120; + protected $_error = NULL; + + protected $_template = array( + //merchant authentication + 'username' => NULL, + 'pw' => NULL, + //payment mode + 'test_override_errors' => 'true', + //transaction information + 'response_mode' => 'simple', + 'response_fmt' => 'delimited', + 'upg_auth' => 'zxcvlkjh', + 'fulltotal' => NULL, // Total amount WITHOUT dollar sign. + 'authamount' => '', // Only valid for POSTAUTH and is equal to the original preauth amount. + 'trantype' => 'sale', // Options: preauth, postauth, sale, credit, void + 'reference' => '', // Blank for new sales; required for VOID, POSTAUTH, and CREDITS; Will be original Approval value. + 'trans_id' => '', // Blank for new sales; required for VOID, POSTAUTH, and CREDITS; Will be original ANATRANSID value. + //credit card information + 'cardtype' => NULL, // Options visa, mc, amex, diners, discover, jcb + 'ccnumber' => NULL, // CC# may include spaces or dashes. + 'month' => NULL, // Must be TWO DIGIT month. + 'year' => NULL, // Must be TWO or FOUR DIGIT year. + 'ccname' => NULL, + //customer information + 'baddress' => NULL, + 'baddress1' => NULL, + 'bcity' => NULL, + 'bstate' => NULL, + 'bcountry' => 'US', // TWO DIGIT COUNTRY (United States = "US") + 'zip' => NULL, + 'phone' => NULL, + 'email' => NULL, + //things that do not usually change + 'target_app' => 'WebEden_Chargev5.06', + 'delimited_fmt_field_delimiter' => '=', + 'delimited_fmt_include_fields' => 'true', + 'delimited_fmt_value_delimiter' => '|'); + + protected $_creditCards = array('visa', 'mc', 'amex', 'diners', 'discover', 'jcb'); + protected $_transactionTypes = array('preauth', 'postauth', 'sale', 'credit', 'void'); + + protected $_transaction = array(); + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + public function __construct($user = NULL, $password = NULL, array $options = array()) { + $this->setUser($user)->setPassword($password); + + $this->_proxy = isset($options['proxy']) ? $options['proxy'] : NULL; + $this->_agent = isset($options['agent']) ? $options['agent'] : 'Mozilla/4.0'; + $this->_timeout = isset($options['timeout']) ? $options['timeout'] : 120; + } + + /* Public Methods + -------------------------------*/ + /** + * Validates required transaction parameters and sends + * the transaction to Innovative Gateway Solutions. + * + * @return string the cURL result + */ + public function send() { + //test for valid amount + if(!$this->_transaction['fulltotal'] || !is_numeric($this->_transaction['fulltotal'])) { + //throw exception + Eden_Webcharge_Error::i() + ->setMessage(Eden_Webcharge_Error::INVALID_AMOUNT) + ->addVariable((string) $this->_transaction['fulltotal']); + } + + //test for valid transaction type + if(!$this->_transaction['trantype'] || !in_array($this->_transaction['trantype'], $this->_transactionTypes)) { + //throw exception + Eden_Webcharge_Error::i() + ->setMessage(Eden_Webcharge_Error::INVALID_TRANSACTION_TYPE) + ->addVariable((string) $this->_transaction['trantype']) + ->trigger(); + } + + //test for valid card type + if(!$this->_transaction['cardtype'] || !in_array($this->_transaction['cardtype'], $this->creditCards)) { + //throw exception + Eden_Webcharge_Error::i() + ->setMessage(Eden_Webcharge_Error::INVALID_CARD_TYPE) + ->addVariable((string) $this->_transaction['cardtype']) + ->trigger(); + } + + //test for valid month + if(!$this->_transaction['month'] || !is_numeric($this->_transaction['month']) || strlen((string) $this->_transaction['month']) != 2) { + //throw exception + Eden_Webcharge_Error::i() + ->setMessage(Eden_Webcharge_Error::INVALID_CREDIT_CARD_MONTH) + ->addVariable((string) $this->_transaction['month']) + ->trigger(); + } + + //test for valid year + if(!$this->_transaction['year'] || !is_numeric($this->_transaction['year']) || !in_array(strlen((string) $this->_transaction['year']), array(2, 4))) { + //throw exception + Eden_Webcharge_Error::i() + ->setMessage(Eden_Webcharge_Error::INVALID_CREDIT_CARD_YEAR) + ->addVariable((string) $this->_transaction['year']) + ->trigger(); + } + + //test for valid creditcard name + if(!$this->_transaction['ccname']) { + //throw exception + Eden_Webcharge_Error::i(Eden_Webcharge_Error::INVALID_CREDIT_CARD_NAME)->trigger(); + } + + // Create the connection through the cURL extension + return Eden_Curl::i() + ->setUrl(self::PAYMENT_URL) + ->when($this->_proxy != NULL) + ->setProxy($this->_proxy) + ->endWhen() + ->setUserAgent($this->_agent) + ->setPost(true) + ->setPostFields($this->_transaction) + ->setFollowLocation(true) + ->setTimeout($this->_timeout) + ->getResponse(); + } + + /** + * Sets the merchant password + * + * @param string password + * @return this + */ + public function setPassword($password) { + Eden_Webcharge_Error::i() + ->setMessage()->argument(1, 'string'); + $this->_transaction['pw'] = $password; + return $this; + } + + /** + * Set a transaction to send. + * + * @param array the transaction to set + * @return string the cURL result + */ + public function setTransaction(array $transaction) { + //we loop through the template because + //these are the keys WebCharge will take + //and we do not want to add any extra variables + //when we query their server + foreach($this->_template as $key => $value) { + //if the passed in transaction + if(isset($transaction[$key])) { + //allow this transaction to be set by it + $this->_transaction[$key] = $transaction[$key]; + //else if it is not set in this transaction + } else if(!isset($this->_transaction[$key])) { + //set it using the template's value + $this->_transaction[$key] = $value; + } + } + + return $this; + } + + /** + * Sets the Merchant user name + * + * @param string user name + * @return this + */ + public function setUser($user) { + Eden_Webcharge_Error::i() + ->setMessage()->argument(1, 'string'); + $this->_transaction['username'] = $user; + return $this; + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ +} + +/** + * WebCharge exception + */ +class Eden_Webcharge_Error extends Eden_Error +{ + /* Constants + -------------------------------*/ + const INVALID_AMOUNT = 'The amount set in the transaction (fulltotal) must be a number. %s was given.'; + const INVALID_TRANSACTION_TYPE = 'The transaction type (trantype) is invalid. "preauth", "postauth", "sale", "credit", "void" are allowed. %s was given.'; + const INVALID_CARD_TYPE = 'The credit card type (cardtype) is invalid. "visa", "mc", "amex", "diners", "discover", "jcb" are allowed. %s was given.'; + const INVALID_CREDIT_CARD_MONTH = 'The credit card month (month) must be a 2 digit number. %s was given.'; + const INVALID_CREDIT_CARD_YEAR = 'The credit card year (year) must be a 2 or 4 digit number. %s was given.'; + const INVALID_CREDIT_CARD_NAME = 'The credit card name cannot be empty.'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/xend.php b/library/eden/xend.php index 7a4b819..5688d12 100644 --- a/library/eden/xend.php +++ b/library/eden/xend.php @@ -1,95 +1,95 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/class.php'; -require_once dirname(__FILE__).'/xend/base.php'; -require_once dirname(__FILE__).'/xend/error.php'; -require_once dirname(__FILE__).'/xend/booking.php'; -require_once dirname(__FILE__).'/xend/rate.php'; -require_once dirname(__FILE__).'/xend/shipment.php'; -require_once dirname(__FILE__).'/xend/tracking.php'; - -/** - * Xend API factory. This is a factory class with - * methods that will load up different Xend classes. - * Xend classes are organized as described on their - * developer site: booking, rate, shipment and tracking service. - * - * @package Eden - * @category xend - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Xend extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /** - * Returns xend booking service - * - * @param *string User token - * @param *boolean test mode - * @return Eden_Xend_Booking - */ - public function booking($userToken, $test = true) { - return Eden_Xend_Booking::i($userToken, $test = true); - } - - /** - * Returns xend rate service - * - * @param *string User token - * @param *boolean test mode - * @return Eden_Xend_Rate - */ - public function rate($userToken, $test = true) { - return Eden_Xend_Rate::i($userToken, $test = true); - } - - /** - * Returns xend shipment service - * - * @param *string User token - * @param *boolean test mode - * @return Eden_Xend_Shipment - */ - public function shipment($userToken, $test = true) { - return Eden_Xend_Shipment::i($userToken, $test = true); - } - - /** - * Returns xend tracking service - * - * @param *string User token - * @param *boolean test mode - * @return Eden_Xend_Tracking - */ - public function tracking($userToken, $test = true) { - return Eden_Xend_Tracking::i($userToken, $test = true); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/class.php'; +require_once dirname(__FILE__).'/xend/base.php'; +require_once dirname(__FILE__).'/xend/error.php'; +require_once dirname(__FILE__).'/xend/booking.php'; +require_once dirname(__FILE__).'/xend/rate.php'; +require_once dirname(__FILE__).'/xend/shipment.php'; +require_once dirname(__FILE__).'/xend/tracking.php'; + +/** + * Xend API factory. This is a factory class with + * methods that will load up different Xend classes. + * Xend classes are organized as described on their + * developer site: booking, rate, shipment and tracking service. + * + * @package Eden + * @category xend + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Xend extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /** + * Returns xend booking service + * + * @param *string User token + * @param *boolean test mode + * @return Eden_Xend_Booking + */ + public function booking($userToken, $test = true) { + return Eden_Xend_Booking::i($userToken, $test = true); + } + + /** + * Returns xend rate service + * + * @param *string User token + * @param *boolean test mode + * @return Eden_Xend_Rate + */ + public function rate($userToken, $test = true) { + return Eden_Xend_Rate::i($userToken, $test = true); + } + + /** + * Returns xend shipment service + * + * @param *string User token + * @param *boolean test mode + * @return Eden_Xend_Shipment + */ + public function shipment($userToken, $test = true) { + return Eden_Xend_Shipment::i($userToken, $test = true); + } + + /** + * Returns xend tracking service + * + * @param *string User token + * @param *boolean test mode + * @return Eden_Xend_Tracking + */ + public function tracking($userToken, $test = true) { + return Eden_Xend_Tracking::i($userToken, $test = true); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/yahoo.php b/library/eden/yahoo.php index 2d875b2..f3fd5e4 100644 --- a/library/eden/yahoo.php +++ b/library/eden/yahoo.php @@ -1,59 +1,59 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Yahoo API factory. This is a factory class with - * methods that will load up different Yahoo classes. - * - * @package Eden - * @category Yahoo - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Yahoo extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Magic - -------------------------------*/ - /* Public Methods - -------------------------------*/ - /** - * Returns FQL - * - * @return Eden_Yahoo_Yql - */ - public function yql() { - return Eden_Yahoo_Yql::i(); - } - - /** - * Returns Yahoo Oauth - * - * @return Eden_Yahoo_Oauth - */ - public function oauth($key, $secret) { - return Eden_Yahoo_Oauth::i($key, $secret); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Yahoo API factory. This is a factory class with + * methods that will load up different Yahoo classes. + * + * @package Eden + * @category Yahoo + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Yahoo extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Magic + -------------------------------*/ + /* Public Methods + -------------------------------*/ + /** + * Returns FQL + * + * @return Eden_Yahoo_Yql + */ + public function yql() { + return Eden_Yahoo_Yql::i(); + } + + /** + * Returns Yahoo Oauth + * + * @return Eden_Yahoo_Oauth + */ + public function oauth($key, $secret) { + return Eden_Yahoo_Oauth::i($key, $secret); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/zappos.php b/library/eden/zappos.php index c5b96c2..a6b4ef9 100644 --- a/library/eden/zappos.php +++ b/library/eden/zappos.php @@ -1,146 +1,146 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -require_once dirname(__FILE__).'/oauth.php'; -require_once dirname(__FILE__).'/zappos/base.php'; -require_once dirname(__FILE__).'/zappos/error.php'; -require_once dirname(__FILE__).'/zappos/autocomplete.php'; -require_once dirname(__FILE__).'/zappos/brand.php'; -require_once dirname(__FILE__).'/zappos/image.php'; -require_once dirname(__FILE__).'/zappos/product.php'; -require_once dirname(__FILE__).'/zappos/review.php'; -require_once dirname(__FILE__).'/zappos/search.php'; -require_once dirname(__FILE__).'/zappos/similarity.php'; -require_once dirname(__FILE__).'/zappos/statistics.php'; -require_once dirname(__FILE__).'/zappos/values.php'; - -/** - * Zappos API factory. This is a factory class with - * methods that will load up different Zappos classes. - * Xend classes are organized as described on their - * developer site: search, image, product, statistics - * brand, review, core values, autocomplete and similarity. - * - * @package Eden - * @category Zappos - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Zappos extends Eden_Class { - /* Constants - -------------------------------*/ - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getSingleton(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - - /** - * Returns Zappos Auto complete - * - * @param *string api key - * @return Eden_Zappos_AutoComplete - */ - public function autocomplete($apiKey) { - return Eden_Zappos_AutoComplete::i($apiKey); - } - - /** - * Returns Zappos brand - * - * @param *string api key - * @return Eden_Zappos_Brand - */ - public function brand($apiKey) { - return Eden_Zappos_Brand::i($apiKey); - } - - /** - * Returns Zappos core values - * - * @param *string api key - * @return Eden_Zappos_AutoComplete - */ - public function values($apiKey) { - return Eden_Zappos_Values::i($apiKey); - } - - /** - * Returns Zappos images - * - * @param *string api key - * @return Eden_Zappos_Search - */ - public function image($apiKey) { - return Eden_Zappos_Image::i($apiKey); - } - - /** - * Returns Zappos products - * - * @param *string api key - * @return Eden_Zappos_Product - */ - public function product($apiKey) { - return Eden_Zappos_Product::i($apiKey); - } - - /** - * Returns Zappos review - * - * @param *string api key - * @return Eden_Zappos_Review - */ - public function review($apiKey) { - return Eden_Zappos_Review::i($apiKey); - } - - /** - * Returns Zappos search results - * - * @param *string api key - * @return Eden_Zappos_Search - */ - public function search($apiKey) { - return Eden_Zappos_Search::i($apiKey); - } - - /** - * Returns Zappos similarity - * - * @param *string api key - * @return Eden_Zappos_Similarity - */ - public function similarity($apiKey) { - return Eden_Zappos_Similarity::i($apiKey); - } - - /** - * Returns Zappos statistics - * - * @param *string api key - * @return Eden_Zappos_Statistics - */ - public function statistics($apiKey) { - return Eden_Zappos_Statistics::i($apiKey); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ -} + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +require_once dirname(__FILE__).'/oauth.php'; +require_once dirname(__FILE__).'/zappos/base.php'; +require_once dirname(__FILE__).'/zappos/error.php'; +require_once dirname(__FILE__).'/zappos/autocomplete.php'; +require_once dirname(__FILE__).'/zappos/brand.php'; +require_once dirname(__FILE__).'/zappos/image.php'; +require_once dirname(__FILE__).'/zappos/product.php'; +require_once dirname(__FILE__).'/zappos/review.php'; +require_once dirname(__FILE__).'/zappos/search.php'; +require_once dirname(__FILE__).'/zappos/similarity.php'; +require_once dirname(__FILE__).'/zappos/statistics.php'; +require_once dirname(__FILE__).'/zappos/values.php'; + +/** + * Zappos API factory. This is a factory class with + * methods that will load up different Zappos classes. + * Xend classes are organized as described on their + * developer site: search, image, product, statistics + * brand, review, core values, autocomplete and similarity. + * + * @package Eden + * @category Zappos + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Zappos extends Eden_Class { + /* Constants + -------------------------------*/ + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getSingleton(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + + /** + * Returns Zappos Auto complete + * + * @param *string api key + * @return Eden_Zappos_AutoComplete + */ + public function autocomplete($apiKey) { + return Eden_Zappos_AutoComplete::i($apiKey); + } + + /** + * Returns Zappos brand + * + * @param *string api key + * @return Eden_Zappos_Brand + */ + public function brand($apiKey) { + return Eden_Zappos_Brand::i($apiKey); + } + + /** + * Returns Zappos core values + * + * @param *string api key + * @return Eden_Zappos_AutoComplete + */ + public function values($apiKey) { + return Eden_Zappos_Values::i($apiKey); + } + + /** + * Returns Zappos images + * + * @param *string api key + * @return Eden_Zappos_Search + */ + public function image($apiKey) { + return Eden_Zappos_Image::i($apiKey); + } + + /** + * Returns Zappos products + * + * @param *string api key + * @return Eden_Zappos_Product + */ + public function product($apiKey) { + return Eden_Zappos_Product::i($apiKey); + } + + /** + * Returns Zappos review + * + * @param *string api key + * @return Eden_Zappos_Review + */ + public function review($apiKey) { + return Eden_Zappos_Review::i($apiKey); + } + + /** + * Returns Zappos search results + * + * @param *string api key + * @return Eden_Zappos_Search + */ + public function search($apiKey) { + return Eden_Zappos_Search::i($apiKey); + } + + /** + * Returns Zappos similarity + * + * @param *string api key + * @return Eden_Zappos_Similarity + */ + public function similarity($apiKey) { + return Eden_Zappos_Similarity::i($apiKey); + } + + /** + * Returns Zappos statistics + * + * @param *string api key + * @return Eden_Zappos_Statistics + */ + public function statistics($apiKey) { + return Eden_Zappos_Statistics::i($apiKey); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ +} diff --git a/library/eden/zappos/base.php b/library/eden/zappos/base.php index 96f8a9b..9baaee8 100644 --- a/library/eden/zappos/base.php +++ b/library/eden/zappos/base.php @@ -1,108 +1,108 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Zappos base - * - * @package Eden - * @category zappos - * @author Christian Blanquera cblanquera@openovate.com - */ -class Eden_Zappos_Base extends Eden_Oauth_Base { - /* Constants - -------------------------------*/ - const URL_SEARCH = 'http://api.zappos.com/Search'; - const URL_IMAGE = 'http://api.zappos.com/Image'; - const URL_PRODUCT = 'http://api.zappos.com/Product'; - const URL_STATISTICS = 'http://api.zappos.com/Statistics'; - const URL_BRAND = 'http://api.zappos.com/Brand/'; - const URL_REVIEW = 'http://api.zappos.com/Review'; - const URL_AUTOCOMPLETE = 'http://api.zappos.com/AutoComplete'; - const URL_VALUE = 'http://api.zappos.com/CoreValue/'; - const URL_SIMILARITY = 'http://api.zappos.com/Search/Similarity'; - - const KEY = 'key'; - const TERM = 'term'; - const PRODUCT_ID = 'productId'; - const INCLUDES = 'includes'; - const PAGE = 'page'; - const LIMITS = 'limit'; - const STYLE_ID = 'styleId'; - const TYPE = 'type'; - const FILTER = 'filters'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_apiKey = NULL; - - /* Private Properties - -------------------------------*/ - /* Get - -------------------------------*/ - /* Magic - -------------------------------*/ - public function __construct($apiKey) { - //Argument 1 must be a string - Eden_Zappos_Error::i()->argument(1, 'string'); - - $this->_apiKey = $apiKey; - } - - /* Public Methods - -------------------------------*/ - /* Protected Methods - -------------------------------*/ - protected function _getResponse($method, array $query = array()) { - //Argument 1 must be a string - Eden_Zappos_Error::i()->argument(1, 'string'); - - //Our request parameters - $default = array(self::KEY => $this->_apiKey); - - //generate URL-encoded query string to build our NVP string - $query = http_build_query($query + $default); - - $curl = Eden_Curl::i() - ->setUrl($method.'?'.$query) - ->setReturnTransfer(TRUE) - ->setHeader(false); - - $results = $curl->getQueryResponse(); - - foreach($results as $key => $value) { - - if(!is_array($value)) { - return $value; - } - - if(!empty($value) && isset($value)) { - - foreach($value as $k => $v) { - - $response = json_decode($k.']}', false); - - if(empty($response)) { - $response = json_decode($k, false); - } - - break; - } - } else { - - return $key; - } - } - return $response; - } - - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Zappos base + * + * @package Eden + * @category zappos + * @author Christian Blanquera cblanquera@openovate.com + */ +class Eden_Zappos_Base extends Eden_Oauth_Base { + /* Constants + -------------------------------*/ + const URL_SEARCH = 'http://api.zappos.com/Search'; + const URL_IMAGE = 'http://api.zappos.com/Image'; + const URL_PRODUCT = 'http://api.zappos.com/Product'; + const URL_STATISTICS = 'http://api.zappos.com/Statistics'; + const URL_BRAND = 'http://api.zappos.com/Brand/'; + const URL_REVIEW = 'http://api.zappos.com/Review'; + const URL_AUTOCOMPLETE = 'http://api.zappos.com/AutoComplete'; + const URL_VALUE = 'http://api.zappos.com/CoreValue/'; + const URL_SIMILARITY = 'http://api.zappos.com/Search/Similarity'; + + const KEY = 'key'; + const TERM = 'term'; + const PRODUCT_ID = 'productId'; + const INCLUDES = 'includes'; + const PAGE = 'page'; + const LIMITS = 'limit'; + const STYLE_ID = 'styleId'; + const TYPE = 'type'; + const FILTER = 'filters'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_apiKey = NULL; + + /* Private Properties + -------------------------------*/ + /* Get + -------------------------------*/ + /* Magic + -------------------------------*/ + public function __construct($apiKey) { + //Argument 1 must be a string + Eden_Zappos_Error::i()->argument(1, 'string'); + + $this->_apiKey = $apiKey; + } + + /* Public Methods + -------------------------------*/ + /* Protected Methods + -------------------------------*/ + protected function _getResponse($method, array $query = array()) { + //Argument 1 must be a string + Eden_Zappos_Error::i()->argument(1, 'string'); + + //Our request parameters + $default = array(self::KEY => $this->_apiKey); + + //generate URL-encoded query string to build our NVP string + $query = http_build_query($query + $default); + + $curl = Eden_Curl::i() + ->setUrl($method.'?'.$query) + ->setReturnTransfer(TRUE) + ->setHeader(false); + + $results = $curl->getQueryResponse(); + + foreach($results as $key => $value) { + + if(!is_array($value)) { + return $value; + } + + if(!empty($value) && isset($value)) { + + foreach($value as $k => $v) { + + $response = json_decode($k.']}', false); + + if(empty($response)) { + $response = json_decode($k, false); + } + + break; + } + } else { + + return $key; + } + } + return $response; + } + + /* Private Methods + -------------------------------*/ } \ No newline at end of file diff --git a/library/eden/zappos/search.php b/library/eden/zappos/search.php index 9f894e1..a094cb2 100644 --- a/library/eden/zappos/search.php +++ b/library/eden/zappos/search.php @@ -1,343 +1,343 @@ - -/* - * This file is part of the Eden package. - * (c) 2011-2012 Openovate Labs - * - * Copyright and license information can be found at LICENSE.txt - * distributed with this package. - */ - -/** - * Zappos Search - * - * @package Eden - * @category search - * @author Christian Symon M. Buenavista sbuenavista@openovate.com - */ -class Eden_Zappos_Search extends Eden_Zappos_Base { - /* Constants - -------------------------------*/ - const ITEMS = 'list'; - const SORT = 'sort'; - const EXCLUDE = 'excludes'; - const EXPRESSION = 'filterExpression'; - - /* Public Properties - -------------------------------*/ - /* Protected Properties - -------------------------------*/ - protected $_terms = NULL; - protected $_limits = NULL; - protected $_list = NULL; - protected $_sort = NULL; - protected $_exclude = NULL; - protected $_page = NULL; - protected $_include = NULL; - protected $_expression = NULL; - protected $_filter = NULL; - protected $_order = 'desc'; - - /* Private Properties - -------------------------------*/ - /* Magic - -------------------------------*/ - public static function i() { - return self::_getMultiple(__CLASS__); - } - - /* Public Methods - -------------------------------*/ - /** - * Set search terms - * - * @param string - * @return this - */ - public function setTerms($terms) { - //Argument 1 must be a string - Eden_Zappos_Error::i()->argument(1, 'string'); - - $this->_terms = $terms; - return $this; - } - - /** - * Set limits in the search query - * - * @param string|int - * @return this - */ - public function setLimits($limits) { - //Argument 1 must be a string or integer - Eden_Zappos_Error::i()->argument(1, 'string', 'int'); - - $this->_limits = $limits; - return $this; - } - - /** - * Set face fields list. - * SetTerms and setList - * cannot call at the same time - * - * @return this - */ - public function setList() { - - $this->_list = 'facetFields'; - return $this; - } - - /** - * Sort result to ascending order - * by default in is set to descending - * - * @return this - */ - public function ascendingOrder() { - - $this->_order = 'asc'; - return $this; - } - - /** - * Sort results by price - * - * @return this - */ - public function sortByPrice(){ - - $this->_sort = '{"price":"'.$this->_order.'"}'; - return $this; - } - - /** - * Sort results by live date - * - * @return this - */ - public function sortGoLiveDate(){ - - $this->_sort = '{"goLiveDate":".'.$this->_order.'."}'; - return $this; - } - - /** - * Sort results by product populariry - * - * @return this - */ - public function sortByPopularity (){ - - $this->_sort = '{"productPopularity":"'.$this->_order.'"}'; - return $this; - } - - /** - * Sort results by recent sale - * - * @return this - */ - public function sortByRecentSale() { - - $this->_sort = '{"recentSales":"'.$this->_order.'"}'; - return $this; - } - - public function sortByBrandNameFacet() { - - $this->_post = '{"brandNameFacet":"'.$this->_order.'"}'; - return $this; - } - - /** - * Exclude results by style Id - * - * @return this - */ - public function excludeByStyleId() { - - $this->_exclude = '["results","styleId"]'; - return $this; - } - - /** - * Exclude results by price - * - * @return this - */ - public function excludeByPrice() { - - $this->_exclude = '["results","price"]'; - return $this; - } - - /** - * Exclude results by original price - * - * @return this - */ - public function excludeOriginalPrice() { - - $this->_exclude = '["results","originalPrice"]'; - return $this; - } - - /** - * Exclude results by product url - * - * @return this - */ - public function excludeProductUrl() { - - $this->_exclude = '["results","productUrl"]'; - return $this; - } - - /** - * Exclude results by color id - * - * @return this - */ - public function excludeColorId() { - - $this->_exclude = '["results","colorId"]'; - return $this; - } - - /** - * Exclude results by product name - * - * @return this - */ - public function excludeProductName() { - - $this->_exclude = '["results","productName"]'; - return $this; - } - - /** - * Exclude results by brand name - * - * @return this - */ - public function excludeBrandName() { - - $this->_exclude = '["results","brandName"]'; - return $this; - } - - /** - * Exclude results by image url - * - * @return this - */ - public function excludeImageUrl() { - - $this->_exclude = '["results","thumbnailImageUrl"]'; - return $this; - } - - /** - * Exclude results by percent off - * - * @return this - */ - public function excludePercentOff() { - - $this->_exclude = '["results","percentOff"]'; - return $this; - } - - /** - * Exclude results by product id - * - * @return this - */ - public function excludeProductId() { - - $this->_exclude = '["results","percentOff"]'; - return $this; - } - - /** - * include facet in resuts - * - * @return this - */ - public function includeFacets() { - $this->_include = '["facets"]'; - return $this; - } - - /** - * Set page number - * - * @param string|int - * @return this - */ - public function setPage($page) { - //Argument 1 must be a string or integer - Eden_Zappos_Error::i()->argument(1, 'string', 'int'); - - $this->_page = $page; - return $this; - } - - /** - * filter results with specific expression - * - * @param string - * @return this - */ - public function filterExpression($expression) { - //Argument 1 must be a string - Eden_Zappos_Error::i()->argument(1, 'string'); - - $this->_expression = $expression; - return $this; - } - - /** - * filter results with distinct expression - * - * @param string - * @param string - * @return this - */ - public function filterProduct($facetFields, $facetValue) { - - Eden_Zappos_Error::i() - ->argument(1, 'string') //Argument 1 must be a string - ->argument(2, 'string'); //Argument 2 must be a string - - $this->_filter = '{".'.$facetFields.'.":[".'.$facetValue.'."]}'; - return $this; - } - - /** - * search zappos products - * - * @return array - */ - public function search() { - //populate fields - $query = array( - self::TERM => $this->_terms, - self::LIMIT => $this->_limits, - self::ITEMS => $this->_list, - self::SORT => $this->_sort, - self::EXCLUDES => $this->_exclude, - self::PAGE => $this->_page, - self::INCLUDES => $this->_include, - self::EXPRESSION => $this->_expression, - self::FILTER => $this->_filter); - - return $this->_getResponse(self::URL_SEARCH, $query); - } - - /* Protected Methods - -------------------------------*/ - /* Private Methods - -------------------------------*/ + +/* + * This file is part of the Eden package. + * (c) 2011-2012 Openovate Labs + * + * Copyright and license information can be found at LICENSE.txt + * distributed with this package. + */ + +/** + * Zappos Search + * + * @package Eden + * @category search + * @author Christian Symon M. Buenavista sbuenavista@openovate.com + */ +class Eden_Zappos_Search extends Eden_Zappos_Base { + /* Constants + -------------------------------*/ + const ITEMS = 'list'; + const SORT = 'sort'; + const EXCLUDE = 'excludes'; + const EXPRESSION = 'filterExpression'; + + /* Public Properties + -------------------------------*/ + /* Protected Properties + -------------------------------*/ + protected $_terms = NULL; + protected $_limits = NULL; + protected $_list = NULL; + protected $_sort = NULL; + protected $_exclude = NULL; + protected $_page = NULL; + protected $_include = NULL; + protected $_expression = NULL; + protected $_filter = NULL; + protected $_order = 'desc'; + + /* Private Properties + -------------------------------*/ + /* Magic + -------------------------------*/ + public static function i() { + return self::_getMultiple(__CLASS__); + } + + /* Public Methods + -------------------------------*/ + /** + * Set search terms + * + * @param string + * @return this + */ + public function setTerms($terms) { + //Argument 1 must be a string + Eden_Zappos_Error::i()->argument(1, 'string'); + + $this->_terms = $terms; + return $this; + } + + /** + * Set limits in the search query + * + * @param string|int + * @return this + */ + public function setLimits($limits) { + //Argument 1 must be a string or integer + Eden_Zappos_Error::i()->argument(1, 'string', 'int'); + + $this->_limits = $limits; + return $this; + } + + /** + * Set face fields list. + * SetTerms and setList + * cannot call at the same time + * + * @return this + */ + public function setList() { + + $this->_list = 'facetFields'; + return $this; + } + + /** + * Sort result to ascending order + * by default in is set to descending + * + * @return this + */ + public function ascendingOrder() { + + $this->_order = 'asc'; + return $this; + } + + /** + * Sort results by price + * + * @return this + */ + public function sortByPrice(){ + + $this->_sort = '{"price":"'.$this->_order.'"}'; + return $this; + } + + /** + * Sort results by live date + * + * @return this + */ + public function sortGoLiveDate(){ + + $this->_sort = '{"goLiveDate":".'.$this->_order.'."}'; + return $this; + } + + /** + * Sort results by product populariry + * + * @return this + */ + public function sortByPopularity (){ + + $this->_sort = '{"productPopularity":"'.$this->_order.'"}'; + return $this; + } + + /** + * Sort results by recent sale + * + * @return this + */ + public function sortByRecentSale() { + + $this->_sort = '{"recentSales":"'.$this->_order.'"}'; + return $this; + } + + public function sortByBrandNameFacet() { + + $this->_post = '{"brandNameFacet":"'.$this->_order.'"}'; + return $this; + } + + /** + * Exclude results by style Id + * + * @return this + */ + public function excludeByStyleId() { + + $this->_exclude = '["results","styleId"]'; + return $this; + } + + /** + * Exclude results by price + * + * @return this + */ + public function excludeByPrice() { + + $this->_exclude = '["results","price"]'; + return $this; + } + + /** + * Exclude results by original price + * + * @return this + */ + public function excludeOriginalPrice() { + + $this->_exclude = '["results","originalPrice"]'; + return $this; + } + + /** + * Exclude results by product url + * + * @return this + */ + public function excludeProductUrl() { + + $this->_exclude = '["results","productUrl"]'; + return $this; + } + + /** + * Exclude results by color id + * + * @return this + */ + public function excludeColorId() { + + $this->_exclude = '["results","colorId"]'; + return $this; + } + + /** + * Exclude results by product name + * + * @return this + */ + public function excludeProductName() { + + $this->_exclude = '["results","productName"]'; + return $this; + } + + /** + * Exclude results by brand name + * + * @return this + */ + public function excludeBrandName() { + + $this->_exclude = '["results","brandName"]'; + return $this; + } + + /** + * Exclude results by image url + * + * @return this + */ + public function excludeImageUrl() { + + $this->_exclude = '["results","thumbnailImageUrl"]'; + return $this; + } + + /** + * Exclude results by percent off + * + * @return this + */ + public function excludePercentOff() { + + $this->_exclude = '["results","percentOff"]'; + return $this; + } + + /** + * Exclude results by product id + * + * @return this + */ + public function excludeProductId() { + + $this->_exclude = '["results","percentOff"]'; + return $this; + } + + /** + * include facet in resuts + * + * @return this + */ + public function includeFacets() { + $this->_include = '["facets"]'; + return $this; + } + + /** + * Set page number + * + * @param string|int + * @return this + */ + public function setPage($page) { + //Argument 1 must be a string or integer + Eden_Zappos_Error::i()->argument(1, 'string', 'int'); + + $this->_page = $page; + return $this; + } + + /** + * filter results with specific expression + * + * @param string + * @return this + */ + public function filterExpression($expression) { + //Argument 1 must be a string + Eden_Zappos_Error::i()->argument(1, 'string'); + + $this->_expression = $expression; + return $this; + } + + /** + * filter results with distinct expression + * + * @param string + * @param string + * @return this + */ + public function filterProduct($facetFields, $facetValue) { + + Eden_Zappos_Error::i() + ->argument(1, 'string') //Argument 1 must be a string + ->argument(2, 'string'); //Argument 2 must be a string + + $this->_filter = '{".'.$facetFields.'.":[".'.$facetValue.'."]}'; + return $this; + } + + /** + * search zappos products + * + * @return array + */ + public function search() { + //populate fields + $query = array( + self::TERM => $this->_terms, + self::LIMIT => $this->_limits, + self::ITEMS => $this->_list, + self::SORT => $this->_sort, + self::EXCLUDES => $this->_exclude, + self::PAGE => $this->_page, + self::INCLUDES => $this->_include, + self::EXPRESSION => $this->_expression, + self::FILTER => $this->_filter); + + return $this->_getResponse(self::URL_SEARCH, $query); + } + + /* Protected Methods + -------------------------------*/ + /* Private Methods + -------------------------------*/ } \ No newline at end of file